リダイレクトがないかのようにターミナルでコマンドの出力を表示したいのですが。また、stderrはerr.logにリダイレクトされ、stdoutはstdout.logにリダイレクトされる必要があります。
ターミナルに表示されている内容の正確なコピー、つまり発生したエラーが発生したときに、別のファイルstdouterr.logに出力することもできます。
次のように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コマンド を参照してください。
Stdoutとstderrを2つの異なるファイルに記録するのは素晴らしいアイデアだと思います。ログを非同期にしませんか?だから私は以下を試しました:
((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log
別の端末で
tail -f --sleep-interval=2 all.log
@dogbane、ありがとう。
両方のストリームをリダイレクトせずに印刷されるのとほぼ同じ順序で保存する別の方法も見つけました。
command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog
しかし、これはプロセス置換をサポートするシェルでのみ機能します。