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脚本编程大全