1

プロセス置換で使用されるサブシェルが次の構成で終了するのを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 番目のファイルの転送が開始されます。

4

5 に答える 5

0

必要以上に複雑にしていると思います。内部bashの実行はメインプロセスのサブプロセスであるため、このようなものは機能します。待機により、印刷前にすべてが完了するまでプロセスが待機します。

for i in {1..3}
do
    bash -c "sleep 1; echo Subshell: $i"  &
done
wait
echo "Finished"

Unix および派生物 (Linux) には、子 (サブ) プロセスを待機する機能がありますが、オリジナルで発生したような孫プロセスは待機できません。このメカニズムを使用しないため、戻って完了を確認するポーリング ソリューションは下品であると考える人もいます。

xargs PID がキャプチャされたソリューションは下品ではなく、複雑すぎました。

于 2018-10-20T21:33:13.433 に答える