stderrとstdoutを別のファイルにリダイレクトしてターミナルに表示する方法は?

stderrとstdoutを別のファイルにリダイレクトしてターミナルに表示する方法は?

リダイレクトがないように、端末でコマンド出力を見たいです。また、stderrはerr.logにリダイレクトする必要があり、stdoutはstdout.logにリダイレクトする必要があります。

端末に表示される内容(つまり、エラーが発生したときに印刷されるエラー)の正確なコピーを別のstdouter.logファイルに保存することをお勧めします。

答え1

tee次のようにコマンドを使用します。

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3teeはstdoutのみを受け入れるので、stderrとstdoutを置き換える方法です。

見てUnixティーコマンド高度なリダイレクトに使用しますtee

答え2

私はstdoutとstderrを2つの異なるファイルに書き込むのが良い考えだと思います。ログを非同期化しませんか?だから、次のことを試しました。

  • stdoutを「stdout.log」に(dogbaneが提案したように)
  • "stderr.log"のstderror(dogbaneが提案したように)
  • すべての出力は「all.log」として出力されます
  • それでもディスプレイから出力を見ることができます(ただし、別の端末にあります!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

他の端末で

tail -f --sleep-interval=2 all.log

答え3

@dogbaneさん、ありがとう。
また、リダイレクトなしで印刷されるため、2つのストリームをおおよその順序で保存する別の方法も見つかりました。

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

ただし、これはプロセス置換をサポートするシェルでのみ機能します。

関連情報