哪个 shell 解释器运行一个没有 hashbang 的脚本...但以 sudo 身份运行?

哪个 shell 解释器运行一个没有 hashbang 的脚本...但以 sudo 身份运行?

这是一个扩展哪个 shell 解释器运行不带 shebang 的脚本?

我正在测试我对所使用的解释器的理解,并发现在以 sudo 形式运行没有 hashbang 的脚本时存在一些奇怪的行为。

脚本如下:

echo "I am running shell $SHELL"

foo=$'dollar'
echo "run with sudo to see the magic dollar sign <$foo>"

当我以普通用户身份运行此脚本时,一切正常,输出: 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 链接到破折号 - 我只能认为它与此有关

答案1

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

您正在 sudo 下运行shdash为您),您可以使用以下命令直接查看pstree

$ cat test.sh
pstree $$
$ ./test.sh
bash───pstree
$ sudo ./test.sh
sh───pstree

使用sh符合 POSIX,尽管规范的该部分并不约束 sudo 的实现选择。

readlink /proc/$$/exe也会dash具体确认。您还可以使用任何其他方法从您链接的问题中识别正在运行的 shell。

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

相关内容