
shebang
スクリプトを実行するために使用するインタープリターを提供するには、次の行を使用します。
#!/bin/bash
echo "Hello world"
私の質問は、スクリプト内で実際にどのインタープリターが使用されているかをどのように判断できるかということです。以下は機能しません。
echo $0
echo $SHELL
答え1
私の理解が正しければ、スクリプトの最初の行からシェルを抽出したいということですね。
を使用すると、$SHELL
実際に使用しているシェルが表示されます。これは、最初の行で指定したシェルと同じである必要はありません。たとえば、.
/source
コマンドを使用すると、現在実行中のシェルで任意のスクリプトを実行できます。
次は、最初の行からのシェルを表示します。
sed -n '1 s/^#!//p' "$0"
以下は$0
実行中のスクリプトです。sed
コマンドは先頭を削除した最初の行を出力します#!
。そのような行がない場合は何も返されないので、これを確認できます。
$(...)
コマンドから値を取得するにはsed
、次のように使用できます。
echo Script "$0" is running with "$SHELL"
echo It should run with "$(sed -n '1 s/^#!//p' "$0")"
答え2
使用:
echo $(readlink -e /proc/$$/exe)
(つまり、自分のプロセスの実行可能ファイルを確認します)。
編集:$SHELL
信頼できないようです。これをファイルに入れてくださいidshell
:
echo I am process $$
echo SHELL is $SHELL
echo /proc/$$/exe is $(readlink -e /proc/$$/exe)
そして、次の出力を比較します。
>bash idshell
I am process 24012
SHELL is /bin/bash
/proc/24012/exe is /bin/bash
そして
>dash idshell
I am process 24062
SHELL is /bin/bash
/proc/24062/exe is /bin/dash
それで、嘘をついているのでしょうか??? (そして、私の Ubuntu ではそれが解決されるので、dash
そうです)。sh
dash