zsh не повністю сумісний з bash. Існують найрізноманітніші відмінності. Новіший zsh більше сумісний з bash (= ~ підтримується, у exec тепер є додаткові параметри прапора тощо), але повна сумісність не є ціллю, навіть не під "емуляцією".
Наприклад, bash substring - $ {foo: offset: len}, але в zsh це $ foo [start, end], і це лише один простий приклад.
zsh - оболонка під впливом tcsh та ksh, яка робить багато речей по-своєму; Сумісність POSIX явно не є метою, але розробники реагують на патчі, які додають параметри / імітують поведінку, що наближає речі до POSIX. Але коли ти починаєш реально вбиратись у силу оболонки, ти починаєш створювати сценарії лише для запису, навіть більше ніж bash.
bash - це POSIX sh + ksh + педантизм, деякі функції тепер скопійовані з zsh. Він також має сценарії лише для запису, але оскільки він має менш потужні оператори, ви, зрештою, не використовуєте лаконічність zsh, і речі можуть бути читабельнішими (за винятком усіх цитувань, щоб уникнути розбиття білого простору, дурний масив $ ksh у стилі ksh означає спочатку -елемент масиву, а не всі елементи масиву тощо тощо).
Писати сценарії, які повністю користуються потужністю будь-якої оболонки, нерозумно, якщо ви не перебуваєте в обмеженому середовищі (наприклад, написання системних сценаріїв rc, де деякі FS не можуть бути встановлені тощо). Як ідеал, використовуйте Perl / Python / Ruby / все, що завгодно велике, що вам потрібна виразність не в Bourne sh, якщо ви хочете, щоб інші могли підтримувати його. Зберігайте матеріали оболонки для речей, що стосуються інтерактивної оболонки (програмування доповнення вкладок тощо).
Я б не використовував bash за zsh. Я б використовував голий sh over zsh для простих скриптів або переходив до мови, де асоціативні масиви мають гідних операторів (на відміну від zsh, де вони, знову ж таки, "стислі"). Я можу переключити скрипт sh на башти, якщо мені потрібна ця маленька функція, щоб розширити існуючий перевірений робочий сценарій і не встигнути його переписати зараз.