Bash脚本在新的Shell中执行还是子Shell中执行?

6
我将从我的bash互动式shell中运行一个bash脚本,方法如下:
./shell.sh

我困惑的是,这个脚本会在新的 shell 实例中运行还是在当前 bash 实例的子 shell 中运行? 我认为所有从 shell 调用的 shell 脚本都会在一个新的 shell 中运行,因此它们无法读取调用 shell 的本地 shell 变量。 另外,如果我在被调用的脚本中放置 "echo $BASH_SUBSHELL" ,它会返回值 "0",表明它不是一个子 shell。但是某些文章则说,当从 shell 中执行 shell 脚本时,会调用一个子 shell。请帮助解答。
1个回答

11

您是正确的,当您使用 ./shell.sh 运行脚本时,它运行在一个新的 shell 中,而不是当前 shell 的子 shell 中。

但它确实运行在一个子进程中,该子进程是一个 shell,所以认为 "子进程+shell=子 shell" 是一种诱人且常见的错误。但这是不正确的。运行脚本的 shell 将不会从父 shell 进程继承 shell 变量(它会继承环境变量,即 export 的变量,但对于任何子进程都是如此),它也不会继承 shell 模式(例如 set -e)或其他 shell 状态,甚至可能并不一定运行相同的 shell(如果您正在运行 bash,而脚本具有 #!/bin/zsh shebang,则会在 zsh 中运行)。因此,逻辑上它是作为启动它的 shell 的子进程而运行的不同的 shell。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接