Shebang,口譯員和腳本

Shebang,口譯員和腳本

可以使用shebangline 提供解釋器來執行腳本:

#!/bin/bash
echo "Hello world"

我的問題是我們如何確定腳本中確實使用了哪個解釋器。以下不起作用:

echo $0
echo $SHELL

答案1

如果我理解正確,那麼您想從腳本的第一行提取 shell。

當您使用時,$SHELL您將顯示您實際使用的 shell,該 shell 不必與第一行指定的相同:例如,您可以使用./source命令在目前執行的任何 shell 中執行任何腳本。

下面將從第一行開始顯示 shell:

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

那麼,dash是在撒謊嗎? (sh因為它在我的 Ubuntu 上也是如此dash)。

相關內容