1

私のシステム上*

cd                                                 # move to home
mkdir tempdir
PATH="$PATH:~/tempdir"                             # put tempdir in path
touch tempdir/tempscript
echo -e '#!/bin/bash\necho h' > tempdir/tempscript # write script
chmod u+x tempdir/tempscript                       # make executable
tempscript                                         # execute

スクリプトを見つけてtempdir/tempscript印刷しますh

ただし、 echo$PATHを実行する~/tempdirと、最後に表示されるため、展開されませんでした。割り当てを二重引用符で囲んでいるため、これが起こると予想されます。

ただし、評価時にチルダ展開が発生する理由に関するドキュメントは見つかりません$PATH。(PATH 変数にはまだ が含まれていることに注意してください~。)

これは移植可能な動作ですか?

* GNU bash 3.2 を搭載した Mac OS X

4

1 に答える 1

3

いいえ、これは移植できません。オペレーティング システムのexecl呼び出しがこの展開を実行しない場合、bash ではないプログラムは、指定されたディレクトリ内で実行可能ファイルを見つけることができません。

展開を引用しなかった場合、これは安全であることに注意してください。

PATH=$PATH:~/tempdir   # this is safe -- expansion happens before assignment
PATH="$PATH:~/tempdir" # this is not -- readers are required to expand

通常、すべてのシェル展開を引用符で囲むことがベスト プラクティスですが、これは代入には必要ありません。これにより、文字列分割とグロブ展開の動作が暗黙的に防止されます。

于 2015-02-06T19:32:04.837 に答える