Linux 中的 Subshell 是什么?
您已经知道 shell。它是一个允许您在 Linux 中运行命令的程序。您与 shell 的主要交互是在终端中运行命令时。
或迟或早,您会遇到一个称为“subshell”的术语,这可能会让您感到困惑。
什么是子 shell?
子 shell 基本上是一个用于运行所需程序的新 shell。子 shell 可以访问“父 shell”设置的全局变量,但不能访问局部变量。子 shell 对全局变量所做的任何更改都不会传递给父 shell。
这有道理吗?可能没有。让我用例子详细解释一下。
这是显示变量“var”值的一行脚本。
echo $var
我将这个变量的值设置为LHB,你认为脚本运行时会显示什么?
惊喜!脚本没有看到var
我之前设置的变量的值。
Shell 脚本在子 shell 中运行(默认)
为什么?因为当你运行一个 shell 脚本时,它会运行到它自己的 shell 中。由于这个 shell 源自另一个 shell(你在其中设置变量并运行脚本),因此它被称为子 shell。
shell 脚本无法看到该变量的值,因为它是一个局部变量,新创建的 shell 无法识别它。如果希望变量可以被其子 shell 访问,则必须使用 export 命令并将其转换为全局变量。
您还可以通过从现有 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 成员,请随意在评论中表达自己的看法。