これ意図以下のテストスクリプト1の目的は、「外部」共同プロセス(実行中)を開始しseq 3
、ループからこの共同プロセスのデータを読み取りwhile
、読み取った各行について、外部ループの現在の反復を識別する行を印刷し、「内部」 「共同プロセスを開始することです。 " "コプロセス(seq
新しいパラメータを使用して実行中)は、ネストされたwhileループからこの内部コプロセスを読み取り、次にこの内部コプロセスをクリーンアップします。ネストされたwhileループは、内部コプロセスで読み取られる各行のいくつかの出力を印刷します。
#!/bin/bash
# filename: coproctest.sh
PATH=/bin:/usr/bin
coproc OUTER { seq 3; }
SAVED_OUTER_PID="${OUTER_PID}"
exec {OUTER_READER}<&"${OUTER[0]}"
while IFS= read -r -u "${OUTER_READER}" OUTER_INDEX; do
printf -- '%d\n' "${OUTER_INDEX}"
START=$(( OUTER_INDEX * 1000000 ))
FINISH=$(( START + OUTER_INDEX ))
# (
coproc INNER { seq "${START}" "${FINISH}"; }
SAVED_INNER_PID="${INNER_PID}"
exec {INNER_READER}<&"{INNER[0]}"
while IFS= read -r -u "${INNER_READER}" INNER_INDEX; do
printf -- ' %d\n' "${INNER_INDEX}"
done
exec {INNER_READER}<&-
wait "${SAVED_INNER_PID}"
# )
done
exec {OUTER_READER}<&-
wait "${SAVED_OUTER_PID}"
このスクリプトを実行すると、次のような結果が得られます。
% ./coproctest.sh
1
./coproctest.sh: line 30: warning: execute_coproc: coproc [12523:OUTER] still exists
./coproctest.sh: line 19: INNER_READER: ambiguous redirect
./coproctest.sh: line 21: read: : invalid file descriptor specification
./coproctest.sh: line 25: INNER_READER: ambiguous redirect
2
./coproctest.sh: line 19: INNER_READER: ambiguous redirect
./coproctest.sh: line 21: read: : invalid file descriptor specification
./coproctest.sh: line 25: INNER_READER: ambiguous redirect
3
./coproctest.sh: line 19: INNER_READER: ambiguous redirect
./coproctest.sh: line 21: read: : invalid file descriptor specification
./coproctest.sh: line 25: INNER_READER: ambiguous redirect
両方のコメント行のコメントを削除すると、ほぼ同じ結果が表示されます。
質問1:複数の共同プロセスを同時に実行できますか?
質問2:それでは、必要な出力を得るために上記のスクリプトをどのように変更する必要がありますか?
1コプロセッシングを始めたばかりだが、まだ理解できない部分が多いです。したがって、スクリプトには不正確な、不器用な、または不要なコードが含まれていることがほぼ確実です。あなたの回答に自由にコメントを提示するか、これらの弱点を修正してください。
ベストアンサー1
マニュアルの最後の部分の「BUGS」セクションでbash
:
一度に1つのアクティブな共同プロセスしか存在できません。