私たちが知っているように、パスにはすべてのコンポーネントに改行文字を含めることができます。
$PATH
それでは、環境変数に改行文字を含めることができると結論付けるべきですか?
$PATH
それでは、Bourne likeのように要素にどのように分割できますか?
IFS=':' ; set -f
for var in $PATH
do
echo "<$var>"
done
ただし、IFSを変更せずに実行できる場合は、より良いでしょう。
ベストアンサー1
POSIX シェルには$IFS
フィールドがあります。区切り記号、区切り文字の代わりにこれら$PATH
の値は、空の文字列(現在のディレクトリを表す)の代わりに分割され/bin:/usr/bin:
ます。以下を行う必要があります。/bin
/usr/bin
/bin
/usr/bin
IFS=:; set -o noglob
for var in $PATH""; do
printf '<%s>\n' "$var"
done
グローバル設定の変更を防ぐために、明示的な分割演算子でシェルを使用できますzsh
。たとえば、次のようになります。
for var in "${(s/:/@)PATH}"; do
printf '<%s>\n' "$var"
done
この場合、配列はzsh
すでに$path
/にバインドされているため、$PATH
次のようになります。csh
tcsh
for var in "$path[@]"; do
printf '<%s>\n' "$var"
done
とにかく、そうです。理論的には、$PATH
すべての変数に改行文字を含めることができるように、改行文字はファイルパスの解析では特別ではありません。私は、識別可能な人が名前$PATH
に改行(またはワイルドカード)を含むディレクトリを置くか、改行を含むコマンド名を指定することを期待していません。$PATH
改行が含まれていないと仮定するスクリプトを誰かが利用できるシナリオも想像するのは難しいです。