我有三个脚本,其中两个用作 shebang
shebang-1
#!/bin/sh
echo "#1"
exec sh -- "$@"
shebang-2
哪个使用shebang-1
#!/home/a/ex/shebang-1
echo "#2"
exec sh -- "$@"
script
#!/home/a/ex/shebang-2
echo script...
当我执行script
时,我期望
#1
#2
script...
相反,我只得到
$ ./script
script...
明确地调用它们,
$ ./shebang-1 ./shebang-2 ./script
#1
#2
script...
文件具有以下权限
$ ls -l
total 24
-rwx------ 1 a a 38 Sep 3 18:00 script*
-rwx------ 1 a a 38 Sep 3 18:05 shebang-1*
-rwx------ 1 a a 50 Sep 3 18:05 shebang-2*
这里有什么问题?
OpenBSD 不支持解释器本身就是 shebangs 中的 shebanged 脚本。解释器必须是实际的二进制文件。
尝试执行
script
失败,ENOEXEC
并且 shell 回退到以/bin/sh
脚本作为第一个参数运行,如文档所述。您可以通过尝试直接运行脚本来检查这一点
execve(2)
,而不是通过 shell、perl 的exec
、xargs(1)
、env(1)
或execvp(3)
其他一些模拟 shell 行为的包装器。如果没有记录,您可以只查看源代码。
无论如何,OpenBSD 就像除了 Linux 之外的大多数其他系统。AFAIK 只有 Linux 似乎支持其他脚本作为解释器,最多 4 级限制,之后
execve
将失败并显示ELOOP
.