zshのIFSでエコーを適用する必要があるのはなぜですか?

zshのIFSでエコーを適用する必要があるのはなぜですか?

PATHzsh 5.8を使用して配列のメンバーを配列として読み取ろうとします。私はBashの使い方に慣れており、通常は次のことができます。

IFS=: p=($PATH)

ただし、zshを使用すると、実際には1つの項目しかない配列が提供されます。書き直すと:

IFS=: p=($(echo $PATH))

その後、正しい数の要素を取得します。なぜそんなことですか?

答え1

これは、zshはPOSIXyシェルとは異なり、デフォルトではパラメータ拡張をトークン化しないためです。コマンドの置換と連携して動作するので、往復でこれを「修正」することができます。ただし、これはまだzshで実行されている正しい操作から離れているため、コマンド置換のecho組み合わせによってデータが破損する可能性があります。

zsh では$=PATHトークン化を要求したり、ここで提供されているより適切なソリューションを使用したりできます。bash / zshで ':'文字を使用して文字列を分割する方法は?

また、 の場合、デフォルトではPATHzshの配列変数にバインドされているので、path配列としてアクセスするために何もする必要はありません。


IFS=: p=($PATH)(引用符のない拡張はファイル名の生成やワイルドカードの影響を受けるため、パスにPATHワイルドカード(およびその他の文字)が含まれている場合は結果が望む結果ではない可能*?[]性があります。echoアイテムを削除します。末尾の改行および(に従ってecho)バックスラッシュを破ることもできます。

関連情報