stderrとstdoutを異なるファイルにリダイレクトし、端末に表示する方法は?


30

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

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


@Nunoいいえ、そうではありません。OPは、stdoutとstderrに異なるファイルを使用したいと考えています。
ドッグベイン

@dogbaneはい、そうです。ごめんなさい
ヌノC.イナーシオ

この質問は今でもとてもよく知っています。見上げてみましょう...これは非常によく似たunix.stackexchange.com/q/4195/250であり、関連するunix.stackexchange.com/q/1416/250
phunehehe

回答:


37

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

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

3>&1 1>&2 2>&3 teeはstdoutのみを受け入れることができるため、stderrとstdoutを交換する方法です。

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


いい解決策。cmd終了コードを取得する方法はありますか?
ターバンオフ

2
置き換え@turbanoff cmd(cmd ; echo >exit_code.txt $?)
パルティアショット

:私は、これはコマンドラインに物事出力の順序良く、保存すべきと考えている((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
TTT

5

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

  • 「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

stderrを2番目のttyに直接送ることはできませんか?その後、ログファイルは必要ありません。
スティーブンルー

@StevenLuはい、名前を知っていて、実行可能な2番目のttyへの書き込み権限がある場合。
Jasen

1
容易になるだろう&| tee all.log、コマンドの最後に代わりに&> all.log
Jasen

@Jasen:私が見るのは2回目です&|。私は理解して&>|&あまりにも、しかし、何をするか&|、この文脈で意味ですか?私は、「bashの(1)」でも、bashのマニュアルページを相談していない、いない、ネット上では、適切な構文の参照を見つけることができませんでした...のTx
Cbhihe

1
これまで私はそれが何もしません伝えることができるよう@Cbhiheは、私が言うことを意味|&
Jasen

3

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

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

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


-2

これを試して :

command 2>&1 | tee bothLog

4
こんにちは、vasile、これは質問に答えません:balkiはstdoutとstderrに別々のファイルを必要とします、あなたの解決策は同じストリームで両方を混ぜます。
マット

なぜ人々はstdoutとstderrを一緒にマージするのですか?または、他の人にそうするように伝えますか?
-nurettin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.