シェバン、通訳、スクリプト

シェバン、通訳、スクリプト

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そうです)。shdash

関連情報