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

Do bash scripts execute in new shells or subshells?

我正在 运行从我的 bash 交互式 shell 中创建一个 bash 脚本作为:

./shell.sh

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

你是对的;当您 运行 一个带有 ./shell.sh 的脚本时,它 运行 在一个新的 shell 中,而不是当前 shell 的子 shell。

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