Jakie funkcje są w Zsh i brakuje w bash, lub odwrotnie?

62

Jako użytkownik Linuksa zawsze używałem bash, ponieważ był domyślny dla każdej używanej dystrybucji. Ludzie używający innych systemów uniksowych, takich jak BSD, wydają się używać znacznie innych powłok. Aby trochę się nauczyć, postanowiłem wypróbować Zsh.

Jako użytkownik bash:

  • Jakie funkcje będę tęsknić?
  • A na które należy uważać?
Macha
źródło
5
@Gilles pewnego dnia może być miło, gdyby wszyscy zostali tu przeniesieni ... i połączeni
xenoterracide

Odpowiedzi:

45

W tym temacie na innych stronach Stack Exchange było już sporo aktywności. O ile pamiętam (po latach temu²) przeszedłem z basha na zsh, to, że niczego mi nie umknęło. Dużo zyskałem; Oto, jak myślę, proste, specyficzne dla Zsh funkcje, których najczęściej używam:

  • Funkcja zsh, której najbardziej brakuje mi, gdy czasami używam bash, to autocd: w zsh wykonanie katalogu oznacza przejście do niego, pod warunkiem, że autocdwłączysz tę opcję.

  • Kolejną bardzo przydatną funkcją jest fantazyjne globbing. Te hieroglify postacie są trochę trudne do zapamiętania, ale bardzo wygodne (jak to często szybciej wyszukać je niż napisać odpowiednik findpolecenia). Kilka prostszych przykładów:
        foo*~*.bak= wszystkie dopasowania foo*oprócz tych pasujących *.bak
        foo*(.)= tylko zwykłe dopasowanie plików foo*
        foo*(/)= tylko dopasowanie katalogów foo*
        foo*(-@)= tylko zawieszenie dowiązań symbolicznych foo*
        foo*(om[1,10])= 10 najnowszych plików dopasowanie foo*
        foo*(Lm+1)= tylko pliki o wielkości> 1 MB = w katalogu i wszystkich podkatalogi rekurencyjnie⁴
        dir/**/foo*foo*dir

  • W przypadku fantazyjnych nazw zmvwbudowane może być przydatne. Na przykład, aby skopiować każdy filedo file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • Zarówno bash, jak i zsh mają system przyzwoitego ukończenia, który należy jawnie włączyć ( . /etc/bash_completionlub autoload -U compinit; compinit). Zsh's jest znacznie bardziej konfigurowalny i ogólnie bardziej elegancki.

Jeśli uruchomisz zsh bez a .zshrc, uruchomi się interaktywne menu, które pozwala wybrać opcje konfiguracji. (Niektóre dystrybucje mogą to wyłączyć; w takim przypadku uruchom autoload zsh-newuser-install; zsh-newuser-install.) Zalecam włączenie zalecanych opcji historii, włączenie uzupełniania („w nowym stylu”) i włączenie „wspólnych opcji powłoki” oprócz beep. Później skonfiguruj więcej opcji w miarę ich odkrywania.

² W tym czasie programowalne zakończenie było zabójczą funkcją zsh, ale bash nabył ją wkrótce.
Funkcje, które bash nabył tylko w wersji 4 (więc wciąż nie są dostępne w wielu systemach), są mniejszego typu.

Gilles
źródło
5
Bash 4.0 obsługuje teraz autocdfunkcję omówioną powyżej. Włącz tę funkcję za pomocą polecenia shopt -s autocd. Następnie funkcja działa zgodnie z opisem.
Philluminati,
Zsh ma również wbudowane wherepolecenie, którego nie należy mylić z whichpoleceniem.
Sildoreth,
@EdGrimm Myślę, że GNU i FreeBSD find mogą zrobić wszystko, co mogą zrobić kwalifikatory zsh glob (z -execpowłoką do takich rzeczy jak selekcja ei potokiem do narzędzi takich jak sorti seddo przepisywania ei sortowania). Oczywiście o wiele bardziej gadatliwie.
Gilles
Po sprawdzeniu i ponownym sprawdzeniu strony podręcznika znalezienia przez ponad dekadę, chyba przestałem naprawdę szukać. Ale gdybym sprawdził ostatni raz przed komentowaniem, przynajmniej widziałbym opcję -size teraz zmniejszającą jednostki do bajtów.
Ed Grimm,
11

Również domyślne uzupełnianie tabulatorów jest lepsze niż bash ... na przykład ...

~/.e.dTAB rozwinie się do ~/.emacs.d/w zsh, bash po prostu wyda dźwięk.

ocodo
źródło
tak nie było. jakiej innej niż domyślna setoptopcji używasz (jeśli w ogóle)?
Uświadomiłem sobie, że _-.ustawiłem jako symbol wieloznaczny. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . Zobacz stackoverflow.com/q/7906078/311660
ocodo
10

zshpozwala edytować polecenie wieloliniowe (patrz edytor linii zsh ), bash nie. Jeśli spróbujesz wykonać tę samą sztuczkę ( Ctrl-p), bash pobierze ostatnie polecenie.

Pedro Silva
źródło
2
Bash robi to, przynajmniej od wersji 4.2.37; zastępuje znaki nowej linii średnikami i umożliwia edycję jednego wiersza.
Keith Thompson
1
Wciąż nie jest tak miły. (:
SilverWolf,
8

Bash ma funkcję otwierania portów za pomocą

/dev/tcp/host/port

lub

/dev/udp/host/port

Jednak jest on wyłączony w Debianie, ponieważ jest postrzegany jako przeszkoda (jeśli ścieżka faktycznie istnieje) i poza zakresem tego, co powinna zrobić powłoka. Więcej informacji [lista dyskusyjna debian]

Portablejim
źródło
5
zsh ma wbudowane narzędzie ztcp, które ma więcej możliwości niż bash's / dev / tcp, nie ma / dev / udp. Wolałbym jednak korzystać z socat.
Stéphane Chazelas,
2

Które - ulepszone w Zsh

whichPoleceń w bash ujawnia tylko położenie polecenia.

W Zsh whichujawni definicję alias, źródło functioni lokalizację polecenia.

Powiedzmy, że mieliśmy alias powłoki:

alias gg='git log'

W Bash, gdybyśmy zapytali: which ggwynik byłby nieważny

W Zsh: which ggda nam ...

gg: aliased to git log

Powiedzmy, że mieliśmy funkcję powłoki:

hello() {
    echo "Hello World"
}

W Bash, gdybyśmy zapytali: which hellowynik byłby nieważny.

W Zsh: which helloda nam ...

hello() {
    echo "Hello World"
}
ocodo
źródło
Bash zapewnia tę samą funkcjonalność za pomocą polecenia type(wbudowanego). I po prostu nitpick: whichto polecenie zewnętrzne, a nie wbudowane bash.
Torkel Bjørnson-Langen,
Istotne pytanie kanoniczne: dlaczego nie użyć „które”? Czego więc użyć?
Anthony Geoghegan
0

zsh - kompletna powłoka

istnieje wiele, czytając zshcontrib(1)można wykryć dwie wersje autoload-able tetrisgier (drugi z ncurses) w zshkonkurencji z emacs, dla kompletności (jak opisano).

=

Chciałbym wspomnieć o tym =słowie kluczowym, które może powodować podrażnienie curl(zazwyczaj zawierają ?var=valw sobie adresy URL ; ale unsetoptmyślę, że jest to możliwe):

  • q file =less( gentoo) rozwiązuje problemq file $(which less)

= rozwija się do pełnej ścieżki danego polecenia.

inne gadżety

inne rzeczy, poza umysłem, to właściwy monit RPS1=%d(do wyświetlania $PWDw dobrym stylu), Alt + H( run-helptj. man), Alt + ? ( which-command) varedi zed( autoloadfunkcja), podobny Alt + Xdo minibufora Emacsa do wykonywania widżetów bez wiązania ich, aliasy globalne i sufiksowe, rozszerzona historia śledzenia czas zakończenia polecenia -mi -regexdopasowujących, emulacja powłoki (np. csh, kshz emulate) oraz autoload run-helpz fragmentów plików dla wbudowanej ins.

biadolenie

Myślę, że większość, jeśli nie wszystkie, funkcje zostały zaimplementowane dawno temu, a po przeczytaniu dzienników zmian nie wprowadzono żadnych większych zmian ani nowych dodatków do funkcji, co jest bardzo smutne (nic więcej do odkrycia i odkrycia).

bashwydają się być bardziej rozproszone w readline(w przeciwieństwie do zle) i gnu historyw duchu linux; np. funkcje readline i skróty klawiszowe mogą być stosowane globalnie (tak jak są przechowywane w ~/.inputrci /etc/inputrc), jeśli nie zostaną zastąpione przez bash bind.

wniosek

Osobiście uważam emacs(zwłaszcza z perspektywy (obecnego?) emacs-noxSmaku), że jest inspiracją dla wyjątkowego oprogramowania, zshi tmuxwykonał bardzo dobrą robotę, będąc przykładem w takiej implementacji; dla osób doceniających jego wartość (do poziomu niepotrzebnego / zależnego od Xserwera). Powłoka uniksowa jest wystarczająco potężna, a jej ciągłość i spójność jest wystarczająca do prawidłowego przepływu pracy i wydajności (w całym przetwarzaniu).

ocodo
źródło