诗翔的Linux学习之路生物信息学与算法我用 Linux

【shell笔记>子shell】:理解子shell

2017-06-29  本文已影响118人  王诗翔

2017.6.26

ps -f命令能够表现子shell的嵌套关系。

添加;来分隔命令可以指定依次运行的一系列命令。

不过这一系列命令并不是进程列表,命令列表想要成为进程列表,这些命令必须包含在括号里。

echo $BASH_SUBSHELL返回为0表明没有子shell,返回为1或更大的数,说明存在。

子shell用法

探索后台模式

&字符会让进程被置于后台:

wsx@wsx-ubuntu:/etc$ sleep 3000& # sleep命令会在后台睡眠3000秒
[1] 10469           # 返回两条信息,方括号内是后台作业号,后者显示作业的进程ID
wsx@wsx-ubuntu:/etc$ ps -f  # ps命令用来显示各种进程
UID        PID  PPID  C STIME TTY          TIME CMD
wsx      10304 10299  0 19:21 pts/0    00:00:00 bash
wsx      10317 10304  0 19:21 pts/0    00:00:00 bash
wsx      10327 10317  0 19:21 pts/0    00:00:00 bash
wsx      10469 10327  0 19:28 pts/0    00:00:00 sleep 3000
wsx      10470 10327  0 19:28 pts/0    00:00:00 ps -f
wsx@wsx-ubuntu:/etc$ jobs  # 也可以通过jobs命令来显示后台作业信息
[1]+  运行中               sleep 3000 &

jobs命令在方括号内显示出作业号,还显示了作业的当前状态以及对应的命令。

将进程列表置于后台

wsx@wsx-ubuntu:/etc$ (sleep 2; echo $BASH_SUBSHELL; sleep 2) &
[2] 10729
wsx@wsx-ubuntu:/etc$ 1

[2]+  已完成               ( sleep 2; echo $BASH_SUBSHELL; sleep 2 )

在CLI中运行子shell的创造性方法之一就是将进程列表置于后台模式。既可以在子shell中进行繁重的处理工作,同时也不会让子shell的I/O受制于终端。

协程

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

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

wsx@wsx-ubuntu:/etc$ coproc sleep 10
[2] 11026

除了会创建子shell之外,协程基本上就是将命令置入后台模式。jobs可以显示作业信息。

可以将协程与进程列表结合起来产生嵌套的子shell。

wsx@wsx-ubuntu:~$ coproc ( sleep 10; sleep 2 )
[1] 3438
wsx@wsx-ubuntu:~$ jobs
[1]+  运行中               coproc COPROC ( sleep 10; sleep 2 ) &
wsx@wsx-ubuntu:~$ ps --forest
  PID TTY          TIME CMD
 3420 pts/1    00:00:00 bash
 3438 pts/1    00:00:00  \_ bash
 3439 pts/1    00:00:00  |   \_ sleep
 3440 pts/1    00:00:00  \_ ps

上一篇下一篇

猜你喜欢

热点阅读