创建子shell

在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。 这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。

当输入bash、生成子shell的时候,你是看不到任何相关的信息的,因此需要另一条命令帮助 我们理清这一切。第4章中讲过的ps命令能够派上用场,在生成子shell的前后配合选项-f来使用。

在生成子shell进程时,只有部分父进程的环境被复制到子shell环境中。这会对包括变量在内 的一些东西造成影响,

exit命令不仅能退出子shell,还能用来登出当前的虚拟控制台终端或终端仿真器软件。只需要在父shell中输入exit,就能够从容退出CLI了。

如果该命令返回0,就表明没有子shell。如果返回 1或者其他更大的数字,就表明存在子shell。

就算是不使用bash shell命令或是运行shell脚本,你也可以生成子shell。一种方法就是使用进程列表.

你可以在一行中指定要依次运行的一系列命令。这可以通过命令列表来实现,只需要在命令之间加入分号(;)即可。

(pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)

进程列表是一种命令分组(commandgrouping)。另一种命令分组是将命令放入花括号中, 并在命令列表尾部加上分号(;)。语法为{ command; }。使用花括号进行命令分组并不 会像进程列表那样创建出子shell。

要想知道是否生成了子shell,得借助一个使用了环境变量的命令。这个命令就是

echo $BASH_SUBSHELL。

在命令行提示符下使用路径./运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell(但可能会创建子进程)。如果你使用的是内建的shell命令,并不会涉及子shell(也不会创建子进程)。

协程

协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。

要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令。

$ coproc sleep 10 [1] 2544
$

除了会创建子shell之外,协程基本上就是将命令置入后台模式。当输入coproc命令及其参数之后,你会发现启用了一个后台作业。屏幕上会显示出后台作业号(1)以及进程ID(2544)。

jobs命令能够显示出协程的处理状态。

$ jobs
[1]+ Running coproc COPROC sleep 10 & $

在上面的例子中可以看到在子shell中执行的后台命令是coproc COPROC sleep 10。COPROC 是coproc命令给进程起的名字。你可以使用命令的扩展语法自己设置这个名字。

$ coproc My_Job { sleep 10; } [1] 2570
$
$ jobs
[1]+  Running
$
coproc My_Job { sleep 10; } &

通过使用扩展语法,协程的名字被设置成My_Job。这里要注意的是,扩展语法写起来有点 麻烦。必须确保在第一个花括号({)和命令名之间有一个空格。还必须保证命令以分号(;)结 尾。另外,分号和闭花括号(})之间也得有一个空格。