私はBashに単語分離機能があることを知っていますが、zshにはありません。
つまり、sh
単語分離機能があるのでしょうか、それともBashだけの機能なのでしょうか?移植可能なシェルスクリプトを作成するには、単語の分離を考慮する必要がありますか、それとも別のシェルによって追加された非標準的なものですか?
ベストアンサー1
暗黙的なトークン化、つまり引用符で囲まれていない変数拡張のトークン化($foo
トークン化とは反対)は、"$foo"
すべてのPOSIX準拠シェル(より一般的にはすべてのsh
シェル)が実行する操作です。また、結果をワイルドカードとして表示します。だからこそ変数置換を二重引用符で囲む必要があります。。コマンドの置換も同様です。
POSIXはそれを呼び出します。フィールド分割そしてパス名拡張。
Zshは標準sh動作から外れます。引用符のない変数置換については単語分割は行いませんが(引用符なしのコマンド置換では単語分割を実行します)、引用符なしの置換では全くグローブを行いません。 (もちろん、Zshにはこれらの機能がありますが、$=foo
トークン化と$~foo
グロービングという非常に具体的な機能があります。)Zshはsh互換シェルではなく、sh互換シェルです。合理的に似ていますが、互換性がなく、暗黙の暗黙的な分割が主な偏差の1つです。
Zshには、shのように暗黙的なトークン化やワイルドカードの指定などの操作を実行する互換モード(zsh実行可能ファイルを呼び出すとsh
自動的に入力されます)があります。ksh
Bashとkshはsh互換シェルです。 BashにはPOSIXといくつかの非互換性がありますが、それを見つけるにはもう少し詳しく調べる必要があります。暗黙の分割などの重要な問題に対して互換性があります。
(T)cshはまったく異なるシェルファミリーです。構文はshとはかなり異なります。それも死んだので心配する必要はありません。