Bashは「無効なファイル記述子」エラーメッセージを表示しません。

Bashは「無効なファイル記述子」エラーメッセージを表示しません。

ファイル記述子に書き込もうとすると、もう一方の端が書き込み前に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

なぜこれが起こるのかご存知ですか?

ベストアンサー1

おすすめ記事