我有三个脚本,其中两个用作 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*
这里有什么问题?
答案1
OpenBSD 不支持解释器,它们本身就是 shebangs 中的 shebanged 脚本。解释器必须是实际的二进制文件。
尝试执行script
失败ENOEXEC
,shell 会退回到/bin/sh
以脚本作为第一个参数运行,如文档所述。
execve(2)
您可以通过尝试直接通过而不是通过 shell、perl 的exec
、xargs(1)
、env(1)
或execvp(3)
其他一些模拟 shell 行为的包装器来运行脚本来检查这一点。
如果没有记录,您可以查看源代码。
无论如何,OpenBSD 与除 Linux 之外的大多数其他系统一样;据我所知,只有 Linux 似乎支持其他脚本作为解释器,最多 4 级,之后将execve
失败并显示ELOOP
.