zsh ist nicht vollständig bash-kompatibel. Es gibt verschiedene Unterschiede. Neuere zsh-Versionen sind besser mit bash kompatibel (= ~ unterstützt, exec verfügt jetzt über zusätzliche Flag-Optionen usw.), die vollständige Kompatibilität ist jedoch kein Ziel, auch nicht unter "emulieren".
Zum Beispiel ist bash substring $ {foo: offset: len}, aber in zsh ist es $ foo [start, end] und das ist nur ein einfaches Beispiel.
zsh ist eine von tcsh und ksh beeinflusste Shell, die vieles auf ihre eigene Weise tut. POSIX-Kompatibilität ist ausdrücklich kein Ziel, aber die Entwickler reagieren auf Patches, die Optionen hinzufügen oder Verhaltensweisen emulieren, die die Dinge näher an POSIX bringen. Aber wenn Sie sich wirklich mit der Leistungsfähigkeit der Shell befassen, erstellen Sie Skripte, die nur zum Schreiben bestimmt sind, mehr noch als Bash.
bash ist POSIX sh + ksh + pedanticism, wobei einige Funktionen jetzt aus zsh kopiert wurden. Es gibt auch schreibgeschützte Skripte, aber da es weniger leistungsstarke Operatoren hat, wird die Prägnanz von zsh möglicherweise nicht verwendet und die Dinge sind besser lesbar (mit Ausnahme aller Anführungszeichen, um die Aufteilung von Leerzeichen zu vermeiden, bedeutet das blöde $ -Array im ksh-Stil zuerst -Element-of-Array, nicht alle-Elemente-of-Array, etc etc).
Das Schreiben von Skripten, die die Leistung einer der beiden Shells voll ausnutzen, ist unklug, es sei denn, Sie befinden sich in einer eingeschränkten Umgebung (z. B. Schreiben von System-RC-Skripten, in denen einige FSs möglicherweise nicht bereitgestellt werden usw.). Verwenden Sie im Idealfall Perl / Python / Ruby / whatever für alles, was groß genug ist, um die Ausdruckskraft zu benötigen, die nicht in Bourne sh enthalten ist, wenn andere es beibehalten sollen. Behalten Sie das Shell-Zeug für Dinge, die sich auf die interaktive Shell beziehen (Tab-Vervollständigungsprogrammierung usw.).
Ich würde bash nicht über zsh verwenden. Ich würde für einfache Skripte Bare-Sh-over-Zsh verwenden oder zu einer Sprache wechseln, in der assoziative Arrays anständige Operatoren haben (anders als in Zsh, wo sie wiederum "prägnant" sind). Ich könnte ein sh-Skript auf bash umstellen, wenn ich diese kleine Funktion benötige, um ein vorhandenes, bewährtes Skript zu erweitern, und keine Zeit habe, es jetzt umzuschreiben.