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?
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło
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).
źródło
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:
autocd:
źródło
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.
źródło
Przy okazji, powiedziano nam tutaj wiele razy, że
bash
moż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
sh
jest tylko codziennym interaktywnym narzędziem.Kiedy przychodzi do
bash
vszsh
-bash
jest w pakiecie więcej*nixes
niż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.źródło
sh
jest bash, włącza tryb zgodności po uruchomieniu jakosh
.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 . :).
źródło