你已经知道shell了。 它是一个程序,可让您在 Linux 中运行命令。 您与 shell 的主要交互是在终端中运行命令时。
迟早,您会遇到一个名为“subshell”的术语,这可能会让您感到困惑。
什么是子外壳?
子shell 基本上是一个新的shell,只是为了运行所需的程序。 子shell 可以访问由“父shell”设置的全局变量,但不能访问局部变量。 子 shell 对全局变量所做的任何更改都不会传递给父 shell。
那有意义吗? 可能不是。 让我用例子来详细解释一下。
这是一个显示变量“var”值的单行脚本。
echo $var
我把这个变量的值设置为LHB,你认为脚本运行时会显示什么?
惊喜! 脚本看不到变量的值 var
我之前已经设置好了。
Shell 脚本在 subshell 中运行(默认情况下)
为什么? 因为当你运行一个 shell 脚本时,它会运行到它自己的 shell 中。 由于此 shell 源自另一个 shell(您设置变量和运行脚本的位置),因此它被称为子 shell。
shell 脚本看不到变量的值,因为它是一个局部变量,并且新创建的 shell 不知道它。 如果您希望变量能够被其子 shell 访问,则必须使用 export 命令并将其转换为全局变量。
您还可以通过从现有外壳启动新外壳来创建子外壳。 赶紧跑 bash
你会在一个子shell中。 您可以使用退出命令 close/exit shell 并返回原来的 shell。

不要将 subshell 视为新的终端窗口。 我知道很难想象,但就是这样。
我使用该变量来显示两个外壳(父外壳和子外壳)之间的差异。 变量 var
在这种情况下没有导出,因此子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 中 subshell 的足够好的信息。
您现在对它有更好的了解还是比以往任何时候都更加困惑? 作为 LHB 成员,请随时在评论中表达自己。