假设我有以下管道:
a | b | c | d
我如何可以等待完成c
(或b
)在sh
或bash
?这意味着该脚本d
可以开始任何时间(和它不是必须等待),但需要完整的输出c
正确地工作。
用例是difftool
用于git
比较图像的。它由调用,git
并需要处理其输入(a | b | c
部分)并显示比较结果(d
部分)。呼叫者将删除a
和所需的输入b
。这意味着在从脚本返回之前,进程c
(或b
)必须终止。另一方面,我不能等待,d
因为这意味着我正在等待用户输入。
我知道我可以将的结果写入c
一个临时文件,或者在中使用FIFO bash
。(不过,不确定FIFO是否会有所帮助。)在没有临时文件的情况下是否可以实现此目的sh
?
编辑
如果我能以可靠的方式找出c
(或b
)进程的进程ID,也许就足够了。然后整个管道可以异步启动,我可以等待进程ID。遵循以下原则
wait $(a | b | { c & [print PID of c] ; } | d)
编辑^ 2
我已经找到了解决方案,欢迎提出评论(或更好的解决方案)。
d
可以随意开始,但是c
需要完成后才能继续。
d
可以在喜欢的时候开始,那您还等什么呢?
d
不使用的输出,c
那么d
组成管道的一部分似乎没有任何意义。但是,如果d
确实使用了输入,那么d
在阅读完所有输入后必须在其输入上工作一段时间,以使您的方法有所不同。
d
开始处理c
输出c
?您不想d
开始处理每条输出线吗?