Shebangなしでスクリプトを実行するシェルインタプリタとは何ですか?

Shebangなしでスクリプトを実行するシェルインタプリタとは何ですか?

私のアカウントのデフォルトシェルはzshですが、ターミナルを開き、bashを起動し、というスクリプトを実行するとします。prac002.shzshまたはbashのどちらのシェルインタプリタがスクリプトを実行するために使用されますか?次の例を考えてみましょう。

papagolf@Sierra ~/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

papagolf@Sierra ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.)

papagolf@Sierra:~/My Files/My Programs/Learning/Shell$ ./prac002.sh 
Enter username : Rex
Rex
# Which interpreter did it just use?

**編集:**スクリプトの内容は次のとおりです。

papagolf@Sierra ~/My Files/My Programs/Learning/Shell % cat ./prac002.sh 
read -p "Enter username : " uname
echo $uname

ベストアンサー1

どのインタプリタを使用するかを示すためにスクリプトが#!shebang行で始まらないため、POSIX と:

もしexecl()POSIX.1-2008のシステムインタフェースボリュームで定義されている[ENOEXEC]エラーに対応するエラーが原因で関数が失敗しました。シェルは、検索結果のパス名を最初のオペランドとして使用してシェルを呼び出すのと同じコマンドを実行する必要があります。、新しいシェルの "$ 0"値をコマンド名に設定できることを除いて、残りの引数を新しいシェルに渡します。実行可能ファイルがテキストファイルではない場合、シェルはこのコマンドの実行をバイパスできます。この場合、エラーメッセージを作成して終了ステータス126を返す必要があります。

この表現は少しあいまいで、シェルごとに解釈が異なります。

この場合、Bashは独自にスクリプトを実行します。。一方、zshで実行すると、zshは使用するsh(システム内のすべて)。

この場合、スクリプトに次の行を追加して動作を確認できます。

echo $BASH_VERSION
echo $ZSH_VERSION

Bashでは、最初の行はバージョンを印刷しますが、2番目の行はどのシェルを使用しても何も表示しません。

  • たとえば/bin/shdashzshまたはdashでスクリプトを実行すると、両方の行は何も出力されません。
  • Bashに接続すると、/bin/shすべての場合に最初の出力行が表示されます。
  • もし/bin/shあればその他のバージョンBash を直接使用する場合と bash と zsh から直接スクリプトを実行すると、他の出力が表示されます。

これps -p $$ロール回答のコマンドスクリプトを実行するためにシェルが使用するコマンドに関する有用な情報も表示されます。

おすすめ記事