嵌套花括号似乎表示您正在创建其他范围的作用域,这需要调用新的子外壳。您可以在ps -H
输出中的Bash的第二个副本中看到这种效果。
在第一级花括号中规定的过程仅在原始Bash shell的范围内运行。任何嵌套的花括号都将在它们自己的作用域Bash shell中运行。
例
$ { { { sleep 20; } | sleep 20; } | ps -H; }
PID TTY TIME CMD
29190 pts/1 00:00:00 bash
5012 pts/1 00:00:00 bash
5014 pts/1 00:00:00 bash
5016 pts/1 00:00:00 sleep
5015 pts/1 00:00:00 sleep
5013 pts/1 00:00:00 ps
取| ps -H
出来的搭配只是让我们可以看到嵌套的花括号,我们可以运行ps auxf | less
在另一个shell。
saml 29190 0.0 0.0 117056 3004 pts/1 Ss 13:39 0:00 \_ bash
saml 5191 0.0 0.0 117056 2336 pts/1 S+ 14:42 0:00 | \_ bash
saml 5193 0.0 0.0 107892 512 pts/1 S+ 14:42 0:00 | | \_ sleep 20
saml 5192 0.0 0.0 107892 508 pts/1 S+ 14:42 0:00 | \_ sleep 20
saml 5068 0.2 0.0 116824 3416 pts/6 Ss 14:42 0:00 \_ bash
saml 5195 0.0 0.0 115020 1272 pts/6 R+ 14:42 0:00 \_ ps auxf
saml 5196 0.0 0.0 110244 880 pts/6 S+ 14:42 0:00 \_ less
但是,等等!
如果您取出管道并使用这种形式的命令,我们将看到您的实际期望:
$ { { { sleep 10; } ; { sleep 10; } ; sleep 10; } } | watch "ps -H"
现在,在出现的监视窗口中,我们每2秒更新一次:
这是第一个sleep 10
:
PID TTY TIME CMD
29190 pts/1 00:00:00 bash
5676 pts/1 00:00:00 bash
5678 pts/1 00:00:00 sleep
5677 pts/1 00:00:00 watch
5681 pts/1 00:00:00 watch
5682 pts/1 00:00:00 ps
这是第二个sleep 10
:
PID TTY TIME CMD
29190 pts/1 00:00:00 bash
5676 pts/1 00:00:00 bash
5691 pts/1 00:00:00 sleep
5677 pts/1 00:00:00 watch
5694 pts/1 00:00:00 watch
5695 pts/1 00:00:00 ps
这是第三个sleep 10
:
PID TTY TIME CMD
29190 pts/1 00:00:00 bash
5676 pts/1 00:00:00 bash
5704 pts/1 00:00:00 sleep
5677 pts/1 00:00:00 watch
5710 pts/1 00:00:00 watch
5711 pts/1 00:00:00 ps
请注意,尽管在不同的花括号嵌套级别调用了所有三个睡眠,但实际上它们确实保留在Bash的PID 5676中。因此,我相信您的问题是使用造成的| ps -H
。
结论
使用的| ps -H
(即管)引起的附加子壳,因此试图询问发生了什么事时,不要使用该方法。