跳至内容

Unix/Shell 和子 Shell 简介

来自 Wikibooks,开放的书籍,面向开放的世界


Shell 和子 Shell

[编辑 | 编辑源代码]

当我们打开一个终端会话时,一个 Shell 会为我们启动。这就是为什么我们在终端窗口中看到一个提示符。

在一个 Shell 中,我们可以通过调用 Shell 程序文件或可执行文件来打开另一个 Shell - 子 Shell。例如,假设您已经打开了一个 Shell,一个普通的 Shell sh。您会看到这个

A vanilla 'sh' shell in a terminal session.
终端会话中的一个普通的 'sh' Shell。

在这个 Shell 的提示符下,我可以调用一个新的子 Shell。我可以使用命令 bash 调用 bash Shell。新的 Shell 可以使用命令 exit 关闭。如果我调用一个 bash 子 Shell,我会看到类似的东西

A bash shell in a terminal session.
终端会话中的一个 bash Shell。

如果我使用 exit 关闭这个 Shell,我会看到

A subshell closed by exit.
一个由 exit 关闭的子 Shell。

Shell 包含进程和变量

[编辑 | 编辑源代码]

一个 Shell 提供

  • 一个提示符,供用户通过启动、管理、交互和结束进程来进行通信
  • 一个用于进程和变量的容器

当您调用一个子 Shell 时,在这个 Shell 中启动的任何进程都包含在其中。除非它们被提交到一些持久存储 - 可能写入硬盘上的文件或从父 Shell 导出到新 Shell,否则任何创建的数据项都会随着 Shell 的关闭而消失。导出不在此处介绍:我们暂时假设变量在创建它们的 Shell 中消失。

为了使这更具体,请考虑这个序列。我们从终端会话中的任何 Shell 开始,创建一个 Shell 变量,就像这样

$ MYVARIABLE="This is the original shell"

要检查内容,我们可以使用 echo,并在变量名前加上 $,就像这样

$ echo $MYVARIABLE

现在我们调用一个 子 Shell。我们将使用 bash Shell。像这样

$ bash

这将启动一个新的 bash 子 Shell,我们可以从更改的提示符中看到,并且在子 Shell 中,我们创建了一个 Shell 变量,就像这样

bash% MYVARIABLE="This is the subshell.  When it closes, this variable is destroyed!"

要检查这个变量的内容,我们使用 echo,就像之前一样

bash% echo $MYVARIABLE

在继续之前,请确保您知道这将显示什么。

现在,如果我们 exit,bash 子 Shell 将关闭,我们将返回到原始 Shell。算出输入以下内容的结果

$ echo $MYVARIABLE

将是什么。

华夏公益教科书