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

Mar*_*tin 3 unix bash shell-script

我总是#!/bin/bash在我的 shell 脚本中声明 shebang 行。最近,当我调用包含调用的脚本时exit,它杀死了我的终端。它通常会杀死分叉进程并返回到我的终端提示。为什么会发生阻止分叉的情况?

编辑

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
Run Code Online (Sandbox Code Playgroud)
  • 我通常使用. script_path或通过脚本的符号链接来调用脚本。

Den*_*son 6

由于获取脚本 using.会导致它在当前 shell 中运行,因此 anexit会导致当前 shell 退出。您可以使用return从源脚本和函数返回。您不能从直接运行的脚本返回。

为了在这些约束下工作,您可以在脚本中放置一个条件测试,以根据它是源代码还是直接运行来做正确的事情。

作为shebang之后的第一行:

called=$_
Run Code Online (Sandbox Code Playgroud)

在您想要退出或返回时:

[[ $called != $0 ]] && exit || return
Run Code Online (Sandbox Code Playgroud)


Zek*_*ell 5

shebang 永远不会导致进程分叉。它不会做任何事情,除非脚本是可执行的,并且它被调用的方式使得系统评估 shebang 以查看使用什么程序/shell 来执行脚本。

例如,如果您已经在 bash 中运行,并且您使用source命令执行了脚本,那么脚本将在您当前运行的 shell 内执行,并且exit会影响该 shell 进程,而不是它成为一个新的 shell结束的过程。

如果您有要运行的脚本文件,则应使用以下命令使其可执行:

chmod +x script
Run Code Online (Sandbox Code Playgroud)

然后,如果要运行脚本,并且假设脚本文件在当前目录中,则使用以下命令:

./script
Run Code Online (Sandbox Code Playgroud)

请注意,这与非常不同. script,后者只是 的简写符号source script

./script是一个相对路径名的脚本文件,该文件搜索工具在当前目录下找到脚本文件“脚本”,然后执行它-这只能如果脚本文件是可执行文件。

如果您有不可执行的脚本文件,那么您可以使用以下命令调用它:

bash script
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,您指定要运行哪个 shell,并且忽略 shebang 行。