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