Linux 中的 Subshel​​l 是什么?

你已经知道shell了。 它是一个程序,可让您在 Linux 中运行命令。 您与 shell 的主要交互是在终端中运行命令时。

迟早,您会遇到一个名为“subshel​​l”的术语,这可能会让您感到困惑。

什么是子外壳?

子shell 基本上是一个新的shell,只是为了运行所需的程序。 子shell 可以访问由“父shell”设置的全局变量,但不能访问局部变量。 子 shell 对全局变量所做的任何更改都不会传递给父 shell。

那有意义吗? 可能不是。 让我用例子来详细解释一下。

这是一个显示变量“var”值的单行脚本。

echo $var

我把这个变量的值设置为LHB,你认为脚本运行时会显示什么?

子shell中无法访问shell的局部变量

惊喜! 脚本看不到变量的值 var 我之前已经设置好了。

Shell 脚本在 subshel​​l 中运行(默认情况下)

为什么? 因为当你运行一个 shell 脚本时,它会运行到它自己的 shell 中。 由于此 shell 源自另一个 shell(您设置变量和运行脚本的位置),因此它被称为子 shell。

shell 脚本看不到变量的值,因为它是一个局部变量,并且新创建的 shell 不知道它。 如果您希望变量能够被其子 shell 访问,则必须使用 export 命令并将其转换为全局变量。

导出变量使其成为全局变量并在子shell 中可访问

您还可以通过从现有外壳启动新外壳来创建子外壳。 赶紧跑 bash 你会在一个子shell中。 您可以使用退出命令 close/exit shell 并返回原来的 shell。

在 Linux 中切换到 subshel​​l移动到子shell,然后从那里退出

不要将 subshel​​l 视为新的终端窗口。 我知道很难想象,但就是这样。

我使用该变量来显示两个外壳(父外壳和子外壳)之间的差异。 变量 var 在这种情况下没有导出,因此子shell不知道它。

嵌套子壳

您也可以以相同的方式创建嵌套子壳。 导出变量后,它仍会导出到随后创建的所有子 shell。

您可以在子shell 中更改导出变量的值。 更改后的值将传递给后续的子 shell(因为变量本身是全局变量),但如果您退出它并返回到原始 shell,则保留原始值。

外壳与子外壳

为什么? 因为导出变量的值被复制到子shell。 它是被改变的副本(从 LHB 到 HOC)。 原始值在父 shell 中保持不变。

所以请记住这一点, 无法从子 shell 中更改父 shell 中变量的值. 是否导出变量都没有关系,变量不会在父 shell 中更改。

Shell 与 Subshel​​l 变量行为

额外提示:在当前 shell 中执行 shell 脚本

正常行为是shell 脚本在其自己的shell 中执行,即子shell。

借助名为点 (.) 的内置 shell 命令,您可以更改此行为并在当前 shell 中运行 shell 脚本。

不,它与运行这样的 ./script 的 shell 脚本不同。 相反,您可以像这样运行它:

. script

这样,来自脚本的命令由当前 shell 执行,就好像它们被输入到终端一样,而不是通过子 shell 中的脚本运行。 脚本可以通过这种方式访问​​局部变量。

在当前 shell 而不是子 shell 中运行 shell 脚本

我认为这是关于 Linux 中 subshel​​l 的足够好的信息。

您现在对它有更好的了解还是比以往任何时候都更加困惑? 作为 LHB 成员,请随时在评论中表达自己。