mur*_*uru 14 shell bash pipe job-control
如果,在bash
,我执行:
cmd1 | cmd2 | ... | cmdi | ... | cmdn &
Run Code Online (Sandbox Code Playgroud)
其中cmd{1..n}
未必是不同的,我怎么得到的PID cmdi
?或者,我如何向cmdi
进程发出信号?(例如,发送SIGUSR1
?)
pkill
/ pgrep
,pidof
等看起来不像很好的答案,因为其他情况下cmdi
或许运行,包括作为同一管道的一部分。jobs -p
给cmd1
我的 PID 。
i
可以是任何东西{1..n}
。
小智 7
对于问题的原始版本,当只需要最后一个命令的 PID 时,特殊变量$!
是完美的。
foo | bar | baz &
baz_pid=$!
Run Code Online (Sandbox Code Playgroud)
没有类似的方法可以轻松访问其他进程的 PID。
添加$pipestatus
(zsh) 和$PIPESTATUS
(bash)花了很长时间,最终使我们能够访问管道中的所有退出状态,以及$?
自原始 Bourne shell 以来一直存在的最后一个退出状态。也许$!
最终会发生类似的事情。