アカウントのデフォルトのシェルがzshであると仮定しますが、ターミナルを開いてbashを起動し、prac002.sh
という名前のスクリプトを実行しました。 、スクリプト、zsh、またはbashの実行に使用されるシェルインタープリターはどれですか?次の例を考えてみましょう:
[email protected] ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf
[sudo] password for papagolf:
papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh
# papagolf's default shell is zsh
[email protected] ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.)
[email protected]:~/My Files/My Programs/Learning/Shell$ ./prac002.sh
Enter username : Rex
Rex
# Which interpreter did it just use?
**編集:**スクリプトの内容は次のとおりです
[email protected] ~/My Files/My Programs/Learning/Shell % cat ./prac002.sh
read -p "Enter username : " uname
echo $uname
承認された回答:
スクリプトが#!
で始まっていないため 使用するインタプリタを示すシバン行、POSIXは次のように述べています:
execl()
の場合 POSIX.1-2008のシステムインターフェイスボリュームで定義されている[ENOEXEC]エラーと同等のエラーが原因で、関数が失敗します。シェルは、検索結果のパス名をそのパス名として呼び出した場合と同等のコマンドを実行する必要があります。最初のオペランド 、新しいシェルの「$ 0」の値がコマンド名に設定される場合を除いて、残りの引数は新しいシェルに渡されます。実行可能ファイルがテキストファイルでない場合、シェルはこのコマンドの実行をバイパスする可能性があります。この場合、エラーメッセージを書き込み、終了ステータス126を返します。
その言い回しは少し曖昧で、シェルが異なれば解釈も異なります。
この場合、Bashはそれ自体を使用してスクリプトを実行します 。一方、代わりにzshから実行した場合、zshはsh
を使用します。 (システム上にあるものは何でも)代わりに。
スクリプトに次の行を追加することで、この場合の動作を確認できます。
echo $BASH_VERSION
echo $ZSH_VERSION
Bashからは、最初の行がバージョンを出力し、2番目の行は使用するシェルに関係なく何も表示しないことに注意してください。
-
/bin/sh
の場合 たとえば、dash
、その後、スクリプトがzshまたはdashから実行された場合、どちらの行も何も出力しません。 -
/bin/sh
の場合 はBashへのリンクであり、すべての場合に最初の行の出力が表示されます。 -
/bin/sh
の場合 異なるバージョンです 直接使用していたものとは異なるBashの場合、bashから直接スクリプトを実行した場合とzshからスクリプトを実行した場合では異なる出力が表示されます。
ps -p $$
roolsの回答からのコマンドには、シェルがスクリプトの実行に使用したコマンドに関する有用な情報も表示されます。