Shebang、解释器和脚本

Shebang、解释器和脚本

可以使用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)。

相关内容