Linux 中的 Subshell 是什么? [解释]
您可能听说过 shell 脚本在其自己的 shell 中运行。了解有关 Linux 中子 shell 概念的更多信息。
您已经了解 shell。它是一个可让您在 Linux 中运行命令的程序。您与 shell 的主要交互是在终端中运行命令时。
迟早,您会遇到一个名为“subshell”的术语,这可能会让您感到困惑。
什么是子壳?
子 shell 基本上是一个新的 shell,只是为了运行所需的程序。子 shell 可以访问“父 shell”设置的全局变量,但不能访问局部变量。子 shell 对全局变量所做的任何更改都不会传递到父 shell。
那有意义吗?可能不会。让我用例子详细解释一下。
这是一个显示变量“var”值的一行脚本。
echo $var
我将该变量的值设置为LHB,您认为脚本运行时会显示什么?
惊喜!该脚本看不到我之前设置的变量 var
的值。
Shell 脚本在子 shell 中运行(默认情况下)
为什么?因为当您运行 shell 脚本时,它会运行到自己的 shell 中。由于此 shell 源自另一个 shell(您在其中设置变量并运行脚本的位置),因此它被称为子 shell。
shell 脚本无法看到该变量的值,因为它是一个局部变量,并且新创建的 shell 不知道它。如果您希望该变量可由其子 shell 访问,则必须使用导出命令并将其转换为全局变量。
您还可以通过从现有 shell 启动新 shell 来创建子 shell。只需运行 bash 即可进入子 shell。您可以使用 exit 命令关闭/退出 shell 并返回到原始 shell。
不要将 subshell 视为新的终端窗口。我知道这很难想象,但事实就是如此。
我使用该变量来显示两个 shell(父 shell 和子 shell)之间的差异。在这种情况下,变量 var
未导出,因此子 shell 不知道它。
嵌套子shell
您也可以以相同的方式创建嵌套子 shell。导出变量后,它仍然导出到随后创建的所有子 shell。
您可以在子 shell 中更改导出变量的值。更改后的值将传递到后续的子 shell(因为该变量本身是全局变量),但如果退出它并返回到原始 shell,则保留原始值。
为什么?因为导出变量的值被复制到子shell中。它是被更改的副本(从 LHB 到 HOC)。原始值在父 shell 中保持不变。
因此请记住这一点,无法从子 shell 中更改父 shell 中变量的值。无论您是否导出变量,该变量都不会在父 shell 中发生更改。
额外提示:在当前 shell 中执行 shell 脚本
正常的行为是 shell 脚本在它自己的 shell(即子 shell)中执行。
借助称为点 (.) 的内置 shell 命令,您可以更改此行为并在当前 shell 中运行 shell 脚本。
不,它与运行 ./script 这样的 shell 脚本不同。相反,你可以像这样运行它:
. script
这样,脚本中的命令将由当前 shell 执行,就像在终端中输入命令一样,而不是通过子 shell 中的脚本运行。脚本可以通过这种方式访问局部变量。
我认为这是有关 Linux 中子 shell 的足够好的信息。
您现在对它有更好的理解还是比以前更加困惑?作为 LHB 会员,请随意在评论中表达自己的看法。