bash 脚本是否在新 shell 或子 shell 中执行?

Qam*_*Ali 6 bash shell scope

我正在从 bash 交互式 shell 运行 bash 脚本,如下所示:

./shell.sh
Run Code Online (Sandbox Code Playgroud)

我遇到的困惑是,这个脚本会在新的 shell 实例中运行还是在当前 bash 实例的子 shell 中运行?我假设从 shell 调用的所有 shell 脚本都在新 shell 内运行,因此它们无法读取调用 shell 的本地 shell 变量。另外,如果我将“echo $BASH_SUBSHELL”放入调用的脚本中,它会返回值“0”,表明它不是子shell。但根据一些文章,他们说从 shell 执行 shell 脚本时会调用子 shell。请帮忙。

Gor*_*son 12

你是对的;当您使用 运行脚本时./shell.sh,它会在新 shell 中运行,而不是在当前 shell 的子 shell 中运行。

它确实在子进程中运行,子进程是一个 shell,因此说“subprocess+shell=subshel​​l,所以它一定是一个子 shell!”是一个诱人且常见的错误。但这是不正确的。运行脚本的 shell 不会从父 shell 进程继承 shell 变量(它将继承环境变量,即exported 变量,但任何子进程都是如此),它不会继承 shell 模式(例如set -e)或其他 shell 状态,它甚至不一定运行相同的 shell(如果您运行 bash 并且脚本有 shebang #!/bin/zsh,它将在 zsh 中运行)。因此,从逻辑上讲,它是一个不同的 shell,只是恰好作为启动它的 shell 的子进程运行。