次のパイプがあると仮定します。
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処理を開始したいですか?それが来るので、各出力行の処理を開始したくないですか?ccd