web-dev-qa-db-ja.com

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

リダイレクトがないかのようにターミナルでコマンドの出力を表示したいのですが。また、stderrはerr.logにリダイレクトされ、stdoutはstdout.logにリダイレクトされる必要があります。

ターミナルに表示されている内容の正確なコピー、つまり発生したエラーが発生したときに、別のファイルstdouterr.logに出力することもできます。

31
balki

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

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

3>&1 1>&2 2>&3は、stderrとstdoutを入れ替える方法です。これは、teeがstdoutしか受け入れないためです。

teeを使用したより高度なリダイレクトについては、 nix teeコマンド を参照してください。

39
dogbane

Stdoutとstderrを2つの異なるファイルに記録するのは素晴らしいアイデアだと思います。ログを非同期にしませんか?だから私は以下を試しました:

  • "stdout.log"へのstdout(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
5
Sreeni

@dogbane、ありがとう。
両方のストリームをリダイレクトせずに印刷されるのとほぼ同じ順序で保存する別の方法も見つけました。

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

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

3
balki