次のパイプがあると仮定します。
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