
ファイル記述子に書き込もうとすると、もう一方の端が書き込み前にfdを閉じると、次のエラーメッセージが表示されます。
./scr.sh: line 5: "$fd": Bad file descriptor
コードはおおよそ次のようになります。
f(){
local fd=$1
sleep 2
if command >&"$fd"; then
echo test >&"$fd" 2>/dev/null
fi
}
coproc sleep 1
f "${COPROC[1]}"
ファイル記述子が破損しているかどうかを検出したり、エラーメッセージを表示しない方法はありますか?
編集:したがって、コマンドを/ dev / nullにリダイレクトする@terdonの提案ソリューションは、すでにリダイレクトされているechoによってエラーが生成されるため機能しません。
coprocを実行した後にfdsをコピーするには、Stephaneのソリューションを選択してください。
編集2:
だから私はfdを複製するための解決策が実際に期待どおりに機能しないことを見つけました。私はサブシェルでコマンドを実行していたので、「閉じた」fdを複製できるかどうかについてのテストは常に成功し、fdが複製されたときに成功することがわかりました。実際には、シェル出口が閉じられます。問題を説明するために上記の例を縮小しました。
coproc sleep 1
exec {fd_in}<&"${COPROC[0]}"-
exec {fd_out}>&"${COPROC[1]}"-
sleep 2
if { >&"${fd_out}"; } 2<> /dev/null; then
echo test >&"$fd_out" 2>/dev/null
fi
echo done #never reaches here
なぜこれが起こるのかご存知ですか?