OpenBSD 的 sh:未使用 shebang

and*_*oss 3 ksh openbsd

我有三个脚本,其中两个用作shebang

  • shebang-1
#!/bin/sh
echo "#1"
exec sh -- "$@"
Run Code Online (Sandbox Code Playgroud)
  • shebang-2 它使用 shebang-1
#!/home/a/ex/shebang-1
echo "#2"
exec sh -- "$@"
Run Code Online (Sandbox Code Playgroud)
  • script
#!/home/a/ex/shebang-2
echo script...
Run Code Online (Sandbox Code Playgroud)

当我执行时script,我期望

#1
#2
script...
Run Code Online (Sandbox Code Playgroud)

相反,我只得到

$ ./script 
script...

Run Code Online (Sandbox Code Playgroud)

明确地调用它们是有效的,

$ ./shebang-1 ./shebang-2 ./script
#1
#2
script...
Run Code Online (Sandbox Code Playgroud)

文件具有以下权限

$ 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*

Run Code Online (Sandbox Code Playgroud)

这里有什么问题?

zev*_*zek 6

OpenBSD 不支持在 shebangs 中本身就是 shebanged 脚本的解释器。解释器必须是实际的二进制文件。

如文档所述,尝试执行script失败,ENOEXECshell 回退到以/bin/sh脚本作为第一个参数运行。

您可以检查试图通过直接运行脚本execve(2),不通过外壳,Perl的execxargs(1)env(1)execvp(3)或模仿shell的行为的一些其他包装。

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

无论如何,OpenBSD 与除 Linux 之外的大多数其他系统一样;AFAIK only Linux 似乎支持其他脚本作为解释器,最多 4 个级别的限制,之后execve将失败并显示ELOOP.