3

echo次のテストスクリプトでは、組み込みのバックグラウンドで実行され、標準出力をアタッチする基本コプロセスを実行します。

#!/bin/bash
# TEST 1
coproc /bin/sleep 100
echo >&${COPROC[1]} &

明らかな理由もなく、スクリプトは常に失敗し、次の出力が表示されます。

./test.sh: line 4: ${COPROC[1]}: Bad file descriptor

正しい構文はむしろこれである必要があるのだろうか(アンパサンドはリダイレクトの前に移動された):

#!/bin/bash
# TEST 2
coproc /bin/sleep 100
echo & >&${COPROC[1]}

この2番目の例は、実行中にエラーを報告しないため機能しているように見えますが、この構文では、リダイレクトは実際には実行されません。実際、この他のテストを検討してください。

#!/bin/bash
# TEST 3
/bin/echo abc & >xfile

テスト3はファイルを作成しますxfileが、何も書き込みません。不思議なことに、リダイレクト後にアンパサンドを再度配置しようとすると、echo作業は正常になります。

#!/bin/bash
# TEST 4
/bin/echo abc >xfile &

テスト4はxfile、文字列内にファイルを作成しますabc

coprocリダイレクトエラーの原因や正しい構文について何か考えがありますか?

4

2 に答える 2

2

別の場所に答えがありますhttp://lists.gnu.org/archive/html/bug-bash/2012-06/msg00027.html :

Coproc ファイル記述子は、サブシェルでは使用できません。これらはパイプを使用して実装されており、サブシェルでパイプ ファイル記述子を開いたままにしておくと、プロセスがハングして適切に終了しなくなり、追跡と再現が非常に困難なバグが発生します。

于 2012-08-30T03:23:41.363 に答える