获取后台管道命令序列中任何命令的 PID

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/ pgreppidof等看起来不像很好的答案,因为其他情况下cmdi或许运行,包括作为同一管道的一部分。jobs -pcmd1我的 PID 。

i可以是任何东西{1..n}

小智 7

对于问题的原始版本,当只需要最后一个命令的 PID 时,特殊变量$!是完美的。

foo | bar | baz &
baz_pid=$!
Run Code Online (Sandbox Code Playgroud)

没有类似的方法可以轻松访问其他进程的 PID。

添加$pipestatus(zsh) 和$PIPESTATUS(bash)花了很长时间,最终使我们能够访问管道中的所有退出状态,以及$?自原始 Bourne shell 以来一直存在的最后一个退出状态。也许$!最终会发生类似的事情。