
可以使用shebang
line 提供解釋器來執行腳本:
#!/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
)。