协程(coproc)

协程(coproc)

Content #

协程同时做两件事:一是在后台生成一个子shell,二是在该子shell中执行命令。要进行协程处理,可以结合使用coproc命令以及要在子shell中执行的命令:

$ coproc sleep 10
[1] 2689

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

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

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

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

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

协程能够让你尽情地发挥想象力,发送或接收来自子shell中进程的信息。只有在拥有多个协程时才需要对协程进行命名,因为你要和它们进行通信。否则的话,让coproc命令将其设置成默认名称COPROC即可。

你可以发挥才智,将协程与进程列表结合起来创建嵌套子shell。只需将命令 coproc放在进程列表之前即可:

$ coproc ( sleep 10; sleep 2 )
[1] 2750
$
$ jobs
[1]+  Running                  coproc COPROC ( sleep 10; sleep 2 ) &
$
$ ps --forest
  PID TTY          TIME CMD
 2367 pts/0    00:00:00 bash
 2750 pts/0    00:00:00  \_ bash
 2751 pts/0    00:00:00  |   \_ sleep
 2752 pts/0    00:00:00  \_ ps

From #

Linux命令行与shell脚本编程大全