OpenBSD 的 sh:shebang 未被使用

OpenBSD 的 sh:shebang 未被使用

我有三个脚本,其中两个用作 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 的execxargs(1)env(1)execvp(3)其他一些模拟 shell 行为的包装器来运行脚本来检查这一点。

如果没有记录,您可以查看源代码

无论如何,OpenBSD 与除 Linux 之外的大多数其他系统一样;据我所知,只有 Linux 似乎支持其他脚本作为解释器,最多 4 级,之后将execve失败并显示ELOOP.

相关内容