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.