哪个 shell 解释器运行一个没有 hashbang 的脚本......但是作为 sudo 运行?

Dav*_*e P 4 linux bash

这是哪个shell解释器运行没有shebang的脚本的扩展

我正在测试我对使用什么解释器的理解,并在运行没有 hashbang 但作为 sudo 的脚本时发现了一些奇怪的行为。

脚本如下:

echo "I am running shell $SHELL"

foo=$'dollar'
echo "run with sudo to see the magic dollar sign <$foo>"
Run Code Online (Sandbox Code Playgroud)

当我以普通用户身份运行此脚本时,一切正常,输出: I am running shell /bin/bash run with sudo to see the magic dollar sign <dollar>

但是当我用 sudo 运行时,我得到了输出 I am running shell /bin/bash run with sudo to see the magic dollar sign <$dollar>

因此,如果没有 sudo,foo 会扩展为“dollar”,但是使用 sudo,$'' 评估将被忽略,它变成了“$dollar”

我现在也明白 $'' 不符合 POSIX 标准,因此如果运行脚本,除非在 bash 下运行,否则不一定有效。并确认sudo bash myscript.sh返回预期的“美元”输出。

但是,在任何这些场景中,$SHELL 表示脚本在 bash 下运行。到底是怎么回事?

PS - 我的 /bin/sh 链接到破折号 - 我只能认为它与此有关

Mic*_*mer 6

$SHELL不会告诉您正在运行哪个 shell,它会告诉您环境变量SHELL是什么。如果尚未设置,Bash 会将其设置为登录 shell 的路径。

您正在sudo 下运行sh( dash, for you),您可以使用以下命令直接查看pstree

$ cat test.sh
pstree $$
$ ./test.sh
bash???pstree
$ sudo ./test.sh
sh???pstree
Run Code Online (Sandbox Code Playgroud)

使用sh与 POSIX 一致,尽管规范的那部分不绑定 sudo 的实现选择。

readlink /proc/$$/exe还将确认它是dash专门的。您还可以使用任何其他方式从您链接的问题中识别正在运行的 shell。

在破折号中,$'abc'是一个没有意义的单独美元符号,后跟一个单引号字符串 - 基本上与foo=$将符号保留在任何外壳中的方式相同。