相关疑难解决方法(0)

在Linux和BSD中使用和不使用shebang执行Bash脚本执行

当一个类似Bash的脚本作为没有shebang的二进制文件执行时,如何以及由谁决定执行什么?

我想 shebang 运行一个普通的脚本是用binfmt_script Linux模块处理的,它检查一个shebang,parses命令行并运行指定的脚本解释器.

但是当有人在没有shebang的情况下运行脚本时会发生什么?我已经测试了直接execv方法并发现那里没有内核魔法 - 即像这样的文件:

$ cat target-script
echo Hello
echo "bash: $BASH_VERSION"
echo "zsh: $ZSH_VERSION"
Run Code Online (Sandbox Code Playgroud)

运行仅执行execv调用的已编译C程序会产生:

$ cat test-runner.c
void main() {
        if (execv("./target-script", 0) == -1)
                perror();
}
$ ./test-runner
./target-script: Exec format error

但是,如果我从另一个shell脚本执行相同的操作,它将使用与原始shell脚本相同的shell解释器运行目标脚本:

$ cat test-runner.bash
#!/bin/bash
./target-script

$ ./test-runner.bash 
Hello
bash: 4.1.0(1)-release
zsh: 

如果我使用其他shell执行相同的技巧(例如,Debian的默认值sh- /bin/dash),它也可以:

$ cat test-runner.dash   
#!/bin/dash
./target-script

$ ./test-runner.dash 
Hello
bash: 
zsh: 

神秘的是,它与zsh没有达到预期的效果,并且不遵循一般方案./bin/sh毕竟看起来像zsh 在这些文件上执行:

greycat@burrow-debian ~/z/test-runner …

linux bash shell freebsd dash-shell

17
推荐指数
2
解决办法
4069
查看次数

标签 统计

bash ×1

dash-shell ×1

freebsd ×1

linux ×1

shell ×1