bash IOリダイレクト、du dup()STDERRメソッド?

bash IOリダイレクト、du dup()STDERRメソッド?

次の例を考えてみましょう。

exec 10>&2 # duplicate STDERR to fd 10
{ echo ok; inexistantcommand; } > /tmp/both 2>&1 10>/tmp/err
exec 10>&- # close fd 10

/tmp/errにエラーがあると予想しましたが空です。

$ cat /tmp/both
ok
-bash: inixistantcommand: command not found

$ cat /tmp/err
$ 

私は何が間違っていましたか?

編集する:

試験を終えた:

{ echo ok; qsdfghjk;  } &> >(tee /tmp/both) 2>/tmp/err

しかし、/tmp/には両方あります。STDOUT

ベストアンサー1

これはファイル記述子をコピーするのではなく、ストリームからデータをコピーするようです。データフローが複製されますtee

{ echo ok; this is an error; } 2> >(tee err.log) | cat >both.log

これにより、ok文字列とエラーメッセージが記録され、both.logエラーメッセージも記録されますerr.log

エラーメッセージは、tee複合コマンドのリダイレクトされたエラーストリームから標準入力ストリームからエラーメッセージを読み取ることによってコピーされます。このteeユーティリティは、すべての入力を指定されたファイルおよび標準出力ストリームに書き込みます。複合コマンドと of の標準出力teeは にパイプされてcat作成されますboth.txt

おすすめ記事