次の例を考えてみましょう。
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
。