为什么 shebang 没有像它应该的那样导致程序分叉?

为什么 shebang 没有像它应该的那样导致程序分叉?

#!/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将完全替换当前进程。

相关内容