プロセス置換で使用されるサブシェルが次の構成で終了するのをbashがどのように待機できますか? (これはもちろん、私が使用している実際の for ループとサブシェルから単純化されていますが、意図をよく示しています。)
for i in {1..3}; do
echo "$i"
done > >(xargs -n1 bash -c 'sleep 1; echo "Subshell: $0"')
echo "Finished"
版画:
Finished
Subshell: 1
Subshell: 2
Subshell: 3
それ以外の:
Subshell: 1
Subshell: 2
Subshell: 3
Finished
これらのサブシェルが完了するまでbashを待機させるにはどうすればよいですか?
アップデート
プロセス置換を使用する理由は、ファイル記述子を使用して、画面に出力されるものとプロセスに送信されるものを制御したいからです。ここに私がやっていることの完全なバージョンがあります:
for myFile in file1 file2 file3; do
echo "Downloading $myFile" # Should print to terminal
scp -q $user@$host:$myFile ./ # Might take a long time
echo "$myFile" >&3 # Should go to process substitution
done 3> >(xargs -n1 bash -c 'sleep 1; echo "Processing: $0"')
echo "Finished"
版画:
Downloading file1
Downloading file2
Downloading file3
Finished
Processing: file1
Processing: file2
Processing: file3
それぞれの処理には、転送よりもはるかに時間がかかる場合があります。帯域幅が制限要因であるため、ファイル転送はシーケンシャルにする必要があります。すべてのファイルが転送されるのを待たずに、受信後に各ファイルの処理を開始したいと考えています。処理は並行して実行できますが、限られた数のインスタンスでのみ実行できます (メモリ/CPU が限られているため)。したがって、5 番目のファイルの転送が終了したばかりで、2 番目のファイルのみが処理を終了した場合、5 番目のファイルが処理される前に 3 番目と 4 番目のファイルの処理が完了する必要があります。その間、6 番目のファイルの転送が開始されます。