Czy jest jakiś powód, aby używać bash nad zsh? [Zamknięte]

33

Jestem ciekawy, dlaczego ktoś chciałby uruchamiać bash zamiast zsh. Mam na myśli, że zsh jest w pełni kompatybilny wstecz z bash. Nie zrozum mnie źle: nie lubię bash ani nic takiego. Po prostu chcę wiedzieć, czy korzystanie z niego w porównaniu z zsh ma jakieś zalety.

Więc jaki jest powód, aby używać bash nad zsh?

Jason Baker
źródło
2
Chciałem tylko zauważyć, że ZSH nie jest w pełni kompatybilny wstecz z BASH. W ZSH indeksowanie tablic zaczyna się od 1 - w BASH indeksowanie tablic zaczyna się od 0. Istnieją również inne różnice, ale chciałem to podkreślić.
Charles Addis,

Odpowiedzi:

29

Przychodzą mi na myśl dwa powody:

Po pierwsze - jest dostępny praktycznie wszędzie. Mam kilka systemów Linux (w tym przypadku CentOS 4.x), które nie mają zainstalowanego zsh. Podobnie muszę dotknąć starożytnych systemów, takich jak Solaris 2.6 i nowsze, HP-UX 10 i nowsze, i podobnie skrzypiące wersje systemu AIX. Dlatego prawie muszę korzystać z bash na tych komputerach, co robię, ponieważ dotykam dziesiątek, jeśli nie setek pojedynczych komputerów w ciągu miesiąca, a aby uzyskać spójność interfejsu, utkniesz przy użyciu domyślne.

Po drugie - jest dostępny praktycznie wszędzie. Oznacza to, że mogę napisać skrypt powłoki bash i mieć 99% pewności, że zadziała po przeniesieniu w inne miejsce.

Tak, te powody są pozornie takie same, ale ich uzasadnienie jest inne.

David Mackintosh
źródło
2
Pamiętam, że miałem ksh88 / ksh93 na HPUX, nigdy nie mieliśmy dostępu do zainstalowania basha.
Zlemini,
24

Zasadniczo Bash jest dostarczany z każdym systemem, zsh nie. Uwielbiam Zsh, ale z tego powodu używam Zsh do użytku interaktywnego, ale Bash do wszystkich moich skryptów .

Uważam, że sprawia to, że wszystko jest prostsze, ponieważ nawet gdy robię zakupy niezależnie od tego, co jest zgodne z bash (setopt SH_WORD_SPLIT?), Nadal mam niewielkie różnice.

Kyle Brandt
źródło
3
To byłby każdy system GNU / Linux, który masz na myśli?
andol
2
Cóż, znalazłem, że pochodzi z OS / X i bsd, nie mam dużego doświadczenia z innymi * nixami, czy oni (ostatnie wersje) zwykle nie mają basha?
Kyle Brandt,
1
Starsze wersje Solaris nie zawierały bash; Zwykle musiałem polegać na tym, że Bourne jest powłoką dla skryptów. Przez jakiś czas tak nie było, ale w niektórych dużych przedsiębiorstwach możesz się na nie natknąć.
user5336,
3
Musiały być wtedy różne BSD: s. Przynajmniej w OpenBSD i FreeBSD musisz zainstalować bash oddzielnie od portów / pakietów.
andol
andol: To są te, których używałem .. Muszę pamiętać niepoprawnie, albo to zrobiłem i po prostu nie pamiętam.
Kyle Brandt,
13

Zsh nie jest w pełni kompatybilny z bash. Istnieje wiele różnic. Nowsze zsh jest bardziej kompatybilne z bash (= obsługiwane ~, exec ma teraz dodatkowe opcje flagi, itp.), Ale pełna kompatybilność nie jest celem, nawet w "emulacji".

Na przykład podciąg bash to $ {foo: offset: len}, ale w zsh to $ foo [start, koniec] i to tylko jeden prosty przykład.

zsh jest powłoką wpływającą na tcsh i ksh, która robi wiele rzeczy po swojemu; Kompatybilność z POSIX wyraźnie nie jest celem, ale programiści reagują na łatki, które dodają opcje / emulują zachowanie, które przybliżają POSIX. Ale kiedy zaczynasz naprawdę wchodzić w moc powłoki, zaczynasz tworzyć skrypty tylko do zapisu, nawet bardziej niż bash.

bash to POSIX sh + ksh + pedantyzm, a niektóre funkcje są teraz kopiowane z zsh. Ma także skrypty tylko do zapisu, ale ponieważ ma mniej wydajne operatory, w rezultacie nie używasz zwięzłości zsh i rzeczy mogą być bardziej czytelne (z wyjątkiem całego cytowania, aby uniknąć podziału białych znaków, głupia tablica $ w stylu ksh oznacza najpierw -element-of-array, nie wszystkie elementy tablicy itp.).

Pisanie skryptów, które w pełni wykorzystują moc którejkolwiek powłoki, jest nierozsądne, chyba że znajdujesz się w ograniczonym środowisku (np. Piszesz systemowe skrypty rc, w których niektóre FS nie mogą być zamontowane itp.). Jako ideał, użyj Perla / Pythona / Ruby / cokolwiek na tyle dużego, że potrzebujesz ekspresji nie w Bourne sh, jeśli chcesz, aby inni mogli to utrzymać. Zachowaj zawartość powłoki dla rzeczy związanych z interaktywną powłoką (programowanie uzupełniania tabulacji itp.).

Nie użyłbym bash nad zsh. Używałbym sh sh zamiast zsh dla prostych skryptów lub przerzuciłbym się na język, w którym tablice asocjacyjne mają przyzwoite operatory (inaczej niż w zsh, gdzie znowu są „zwięzłe”). I może włączyć skrypt sh do bash, jeśli muszę, że jedna mała opcja przedłużenia istniejącego sprawdzoną pracujących skrypt i nie mają czasu, aby przepisać go teraz.

Phil P.
źródło
6
nb: $ {foo: offset: len} jest teraz obsługiwany w Zsh, dla kompatybilności.
Phil P
6

Moja rada: jeśli dążysz do absolutnej przenośności, pisz przy użyciu reguł powłoki Bourne'a, nawet nie zawracaj sobie głowy rozszerzeniami Korna. Jak wspomniano, są to niektóre starsze „duże skrzynki” wokół, które w ogóle nie mają na sobie powłok GNU.

Bash już robi „za dużo”. Mam w pracy przyjaciela, który woli Zsh, ale nie wiem, co dokładnie robi.

W każdym razie, albo napisz dla powłoki Bourne'a (lub „bourne again”), albo naprzemiennie, jeśli robisz niestandardowy skrypt dla niewielkiej liczby określonych pól, całkowicie pomiń „shell hell” i po prostu pisz za pomocą perla lub python (lub cokolwiek innego Twój ulubiony lokalnie zainstalowany tłumacz to).

Roboprog
źródło
5

Oprócz podanego powyżej powodu przenośności, innym powodem może być to, że bash wciąż dodaje funkcje.

Na przykład wprowadzono bash v4.x + :

  • rekurencyjne globowanie:

    rm -f ** / *. log

  • autocd:

    Wpisz „/ tmp” zamiast „cd / tmp”

kawalkada
źródło
2
W jaki sposób funkcje kopiowania bash z zsh są powodem używania bash?
qqx
5

Nawiasem mówiąc, wielokrotnie mówiono nam, że bash można znaleźć praktycznie wszędzie, więc używaj go do pisania przenośnych skryptów, co jest fałszywe.

Nonsens. Jeśli wiesz, że każdy system, na którym ci zależy, ma BASH, to jest to całkowicie rozsądne stwierdzenie. BASH ma wiele przydatnych funkcji, których nie można racjonalnie emulować w POSIX sh. Frywolne korzystanie z funkcji innych niż POSIX nie jest dobrym pomysłem, ale korzystanie z nich, gdy naprawdę ich potrzebujesz, jest w porządku.

Przenośność nie jest absolutna. Jest dyskusyjne, jak daleko trzeba się posunąć, tak jak wszystko inne. Na przykład Fedora używa poleceń powłoki do budowania pakietów RPM, a wytyczne dotyczące pakowania Fedory stwierdzają, że skoro wszystkie pakiety muszą być budowane natywnie na Fedorze, dobrze jest używać wszystkich funkcji BASH. Chociaż teoretycznie inne dystrybucje bez BASH mogą chcieć ponownie użyć źródłowych RPM, podjęły decyzję o przenośności na podstawie praktyczności zamiast mantry „ZAWSZE UZE POSIX !! 1”.

ZSH nie przyjął się jako domyślna powłoka, po prostu dlatego, że jest to rozległy bałagan pomysłów na wpół upieczonych.

Craig
źródło
2
Czy możesz wyjaśnić, które funkcje lub pomysły w Zsh uważasz za niedopieczone i dlaczego?
funroll
2

Przy okazji, powiedziano nam tutaj wiele razy, że bashmożna go znaleźć praktycznie wszędzie, więc używaj go do pisania przenośnych skryptów, co jest fałszywe .

Właściwym sposobem pisania przenośnych skryptów unixowych jest użycie sh, które można znaleźć w każdym systemie * nix .

Każda inna powłoka oprócz tego shjest tylko codziennym interaktywnym narzędziem.

Kiedy przychodzi do bashvs zsh- bashjest w pakiecie więcej *nixesniż zsh, więc tutaj są wady instalowania dodatkowego oprogramowania w systemie - musisz go utrzymać. Niektórzy ludzie uwielbiają „fajne funkcje” zsh, więc lubią płacić tę cenę, inni nie.

Samat
źródło
2
Wiele nowoczesnych implementacji sh to tylko linki do bash.
user9517 obsługuje GoFundMonica
2
@Iain Ubuntu domyślnie używa myślnika , a nawet jeśli shjest bash, włącza tryb zgodności po uruchomieniu jako sh.
mgorven
2

Kolejny punkt:

Wiele programów domyślnie zapewnia fajne zakończenie bash. Dla mnie to powód, aby się nie przełączać.

[dodane w lipcu 2013 r.] Cóż po kilku latach używania zsh od powyższego komentarza, muszę powiedzieć, że uzupełnianie tabulatorów (nawet wbudowane, bez modyfikacji 3-częściowych) jest genialne i wygląda na to, że znacznie wykracza poza to, co oferuje bash . :).

Wojciech Kaczmarek
źródło
3
Myślę, która współpracuje z zsh, jak również z zakończeniem zakładki w zsh, mam wiele konkretnych argumentów programu ...
Kyle Brandt
Ciekawy. Czy mówisz, że pliki ukończenia bash działają z zsh, czy tylko niektóre programy mają specyficzne dla zsh uzupełnianie? Nadal istnieje pewien układ plików uzupełniających bash, który Zsh może, ale nie musi, rozważać automagicznie. Czy poprawiłeś konfigurację zsh, aby działała?
Wojciech Kaczmarek,
@Wojciech Kaczmarek: Myślę, że chcesz 19.3 z następujących: zsh.sourceforge.net/Doc/Release/zsh_19.html . Szczerze mówiąc, nigdy nie poświęciłem czasu, aby naprawdę to zrozumieć, po prostu oderwałem plik .zshrc, który znalazłem online :-) Ale to uzupełni argumenty wiersza poleceń z programów takich jak apt, grep itp.
Kyle Brandt
5
Uzupełnianie tabulacji bash jest bardzo podobne do starego systemu uzupełniania tabulatorów w zsh. Jest to jeden z pomysłów skopiowanych z zsh do bash (istnieją inne skopiowane bash do zsh). Możesz użyć skryptów ukończenia napisanych dla bash w zsh, uruchamiając „bashcompinit”, a następnie używając poleceń „complete” i / lub „compgen” w zsh - jest to możliwe, ponieważ funkcjonalność bash jest podzbiorem funkcji dostępnych w zsh i więc może być emulowany. Więc nie ma powodu, aby przejść na bash, ponieważ polecenie jest wysyłane z zakończeniem bash.
Phil P