私は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とはかなり異なります。それも死んだので心配する必要はありません。
答え2
フィールド分割POSIX規格では:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05
パラメータ拡張(Parameter Expansion)、コマンド置換(Command Substitution)、算術拡張(Arithmetic Expansion)の後、シェルはフィールド分割のために二重引用符で囲まれていない拡張および置換結果をスキャンして複数のフィールドを生成できます。
シェルはIFSの各文字を区切り文字として扱い、区切り文字をフィールド終端として使用して、パラメータ拡張、コマンド置換、および算術拡張の結果をフィールドに分割する必要があります。