这是一个扩展哪个 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 下运行sh
(dash
为您),您可以使用以下命令直接查看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=$