![为什么 shebang 没有像它应该的那样导致程序分叉?](https://linux22.com/image/1268617/%E4%B8%BA%E4%BB%80%E4%B9%88%20shebang%20%E6%B2%A1%E6%9C%89%E5%83%8F%E5%AE%83%E5%BA%94%E8%AF%A5%E7%9A%84%E9%82%A3%E6%A0%B7%E5%AF%BC%E8%87%B4%E7%A8%8B%E5%BA%8F%E5%88%86%E5%8F%89%EF%BC%9F.png)
#!/bin/bash
我总是在 shell 脚本中声明 shebang 行。最近,当我调用包含exit
调用的脚本时,它终止了我的终端。它通常会终止分叉的进程并返回到我的终端提示符。为什么会发生停止分叉的情况?
编辑
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
- 我通常使用
. script_path
或通过脚本的符号链接来调用脚本。
答案1
Shebang 永远不会导致进程分叉。它不会任何事物除非该脚本是可执行的,并且以某种方式调用它,导致系统评估shebang以查看使用哪个程序/shell执行该脚本。
例如,如果您已经在 bash 中运行,并且使用命令执行了脚本source
,那么该脚本将在您当前运行的 shell 内执行,并且会exit
影响该 shell 进程,而不是结束新的 shell 进程。
如果您有一个想要运行的脚本文件,您应该使用以下命令使其可执行:
chmod +x script
然后,如果您想运行该脚本,并且我们假设脚本文件在当前目录中,则使用以下命令:
./script
请注意,这是非常不同于. script
,它只是的简写形式source script
。
是./script
脚本文件的相对路径名,这意味着在当前目录中搜索以找到脚本文件“script”,然后执行它 - 只有当脚本文件可执行时才有效。
如果您有不可执行的脚本文件,那么您可以使用以下命令调用它:
bash script
但在这种情况下,您要指定要运行哪个 shell,并且 shebang 行会被忽略。
答案2
由于使用 执行脚本.
会导致它在当前 shell 中运行,因此exit
会导致当前 shell 退出。您可以使用return
从执行脚本以及函数返回。您不能从直接运行的脚本返回。
为了在这些限制内工作,您可以在脚本中添加条件测试,根据脚本的来源或直接运行来执行正确的操作。
正如 shebang 之后的第一行:
called=$_
当您想要退出或返回时:
[[ $called != $0 ]] && exit || return
答案3
Shebang 不会导致程序分叉;进程是否分叉取决于脚本的执行方式。获取脚本将导致它在当前解释器中运行,而使用exec
将完全替换当前进程。