私はbashからzshに切り替えることを考えていますが、bashスクリプトの互換性について心配しています。
すべてのbashスクリプト/関数はzshと互換性がありますか?したがって、それが当てはまる場合、zshはbashの拡張機能にすぎませんか?
スクリプトが#!/bin/bash
という行で始まる場合、デフォルトのシェルがzshであっても、bashを使用して実行されます。
Zshの構文はbashの構文に非常に近いことがわかりました。本当に互換性がない場合は注意を払いませんでした。 6年前にbashからzshにシームレスに切り替えました。
Zshは、適切なエミュレーションモード(emulate sh
またはemulate ksh
)に配置すると、ほとんどのBourne、POSIX、またはksh88スクリプトを実行できます。 bashまたはksh93のすべての機能をサポートしているわけではありません。 Zshにはbashのほとんどの機能がありますが、多くの場合、構文は異なります。
インタラクティブに使用するシェルは、使用するスクリプトとは無関係です。スクリプトを実行するシェルは、最初の行 Shebang で示されているシェルです。たとえば、スクリプトが#!/bin/bash
で始まる場合、bashによって実行されます。
Bashをカスタマイズした場合、.bashrc
を.zshrc
に名前変更することはできません。 2つのシェルの交差部分に固執する限り(交差部分はksh88と pdksh に近い)、いくつかの項目、たとえばエイリアスと関数を共有できます。プロンプトの設定、補完機能、ほとんどのオプションなど、その他のものは完全に書き直す必要があります。
人々が.bashrc
または.zshrc
からソースを取得するスニペットを作成していて、2つのバージョンを維持したくない場合は、bashおよびzsh機能の共通サブセットに固執します。 bashのプログラミング機能。コード全体を関数に入れ、各関数の先頭に次の行を置きます。
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
emulate sh
の代わりにemulate ksh
を使用して、.profile
に必要なプレーンなsh構文に近づけることができます。
関数が別の関数を呼び出す場合、他の関数はエミュレート設定を継承するため、この行を内部関数に配置する必要はなく、エンドユーザーによって呼び出される関数にのみ配置します。
Shebangが_#!/bin/bash
_で、スクリプトを_./script
_として開始した場合、スクリプトはbashによって実行されます。ここではまったく問題ありません。
ただし、_zsh ./script
_を実行するか、実行中のzshインスタンスに_. ./script
_をソースする場合、bashとzshの構文が一致しないことがよくあります。
たとえば、zshはデフォルトでパラメーター展開を分割しません。bashには組み込みのヘルプがあり、zshには_read -p Prompt
_がありません(構文は非常に異なります。読み取りcmd \?prompt , arrays start on 1 (not 0) in zsh,
command only search for external commands in zsh, or there is no (simple) equivalent to
$ {foo ^} `(最初の文字のみ大文字)は、zshなどの中でこれは(ほとんど) 類似点といくつかの違い の長いリストです。
場合によっては、zshは他のシェルをエミュレートするように指示されることがあります。場合によっては、両方のシェルに移植可能な共通の構文がない(別名または関数を使用して移植可能なソリューションをエミュレートしない場合)。
ただし、zshには多くの(多くの)拡張機能があり、対話形式での作業が容易になります。それは同時に、切り替える優れた理由と問題です。
ls *(.)
(他のシェルでは難しい)。 十分に深く見たときに、zsh(print -rl -- *(/)
) でも答えが複雑になります。Con zsh:
結局、それはあなたの選択です、そして、私はいつもより多くの選択肢が好きです。