可以使用shebang
行来提供用于执行脚本的解释器:
#!/bin/bash
echo "Hello world"
我的问题是,我们如何在脚本中确定确实使用了哪个解释器。以下方法不起作用:
echo $0
echo $SHELL
答案1
如果我理解正确的话,那么您想从脚本的第一行提取 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
这是在撒谎吗?(在我的 Ubuntu 上sh
,这确实是在撒谎dash
)。