これは拡張ですShebangなしでスクリプトを実行するシェルインタプリタとは何ですか?
私は使用中のインタプリタの理解度をテストしていますが、ハッシュバンなしでsudoでスクリプトを実行するときに奇妙な動作を見つけました。
スクリプトは次のとおりです。
echo "I am running shell $SHELL"
foo=$'dollar'
echo "run with sudo to see the magic dollar sign <$foo>"
通常のユーザーとしてこのスクリプトを実行すると、すべてがうまく機能し、結果は次のようになります。
I am running shell /bin/bash
run with sudo to see the magic dollar sign <dollar>
ただし、sudoを使用して実行すると出力が表示されます。
I am running shell /bin/bash
run with sudo to see the magic dollar sign <$dollar>
したがって、sudoがない場合、fooは「dollar」に拡張されますが、sudoを使用すると$ ''評価は無視され、「$dollar」になります。
また、$ ''はPOSIXと互換性がないため、bashの外部でスクリプトを実行すると必ずしも機能しないことも理解しています。sudo bash myscript.sh
予想される「USD」出力が返されたことを確認してください。
ただし、これらのシナリオでは、$ SHELLはスクリプトがbashで実行されていることを意味します。どうしたの?
PS - 私の/bin/shはダッシュにリンクされています。 - これがこれに関連していると仮定できます。
ベストアンサー1
$SHELL
どのシェルが実行されているかを知らせるのではなく、SHELL
環境変数が何であるかを知らせます。まだ設定していない場合、Bashはそれをログインシェルパスに設定します。
sh
sudo(あなたのため)で実行している場合は、次のように直接表示できdash
ますpstree
。
$ cat test.sh
pstree $$
$ ./test.sh
bash───pstree
$ sudo ./test.sh
sh───pstree
sh
この仕様のこの部分はsudoの実装選択を制限しませんが、使用はPOSIXに準拠しています。
readlink /proc/$$/exe
dash
詳しくは確認いたします。別の方法を使用して、接続した質問で実行されているシェルを識別することもできます。
ダッシュには意味のない単一のドル記号があり、その後に一重引用符文字列があります。デフォルトでは、シンボルがすべてのシェルに保持されるのと同じ方法です$'abc'
。foo=$