bash:stderrをファイルにリダイレクトし、stdout + stderrを画面にリダイレクトします。

bash:stderrをファイルにリダイレクトし、stdout + stderrを画面にリダイレクトします。

コマンドのstderrストリームをログファイルに保存したいのですが、出力全体(stdout + stderr)も画面に表示したいと思います。どうすればいいですか?

私はコンソールにstdout + stderrを表示し、両方のストリームをファイルにリダイレクトするソリューションのみを見つけました。

 foo | tee output.file

https://stackoverflow.com/questions/418896/how-to-redirect-output-to-a-file-and-stdout)

しかし、stderrをログファイルにリダイレクトしたいと思います。

答え1

最近のbashでは、プロセス置換を使用できます。

foo 2> >(tee stderr.txt)

これはちょうどteeを実行しているプログラムにstderrを送信することです。

より持ち運びに便利

exec 3>&1 
foo 2>&1 >&3 | tee stderr.txt

これはファイル記述子3を現在の標準出力(つまり画面)のコピーにし、パイプを設定して実行しますfoo 2>&1 >&3。これは、fooのstderrを現在のstdout(つまりパイプ)と同じ場所に送信し、stdoutをfd 3(生出力)に送信します。このパイプはfooの生のstderrをteeに供給し、それをファイルに保存して画面に送信します。

答え2

私が見つけることができる最良の答えは次のとおりです。 ここ

(cmd 2> >(tee /dev/stderr)) > log

2本のパイプ(標準出力そして標準エラー)両方(画面そして文書)インライン条件で使用するとエラーをキャッチできます(もし)または連続したインラインコマンド。

前任者:

$((curl "https://unix.stackexchange.com"  2> >(tee /dev/stderr)) >> logfile) && echo "some other commands if curl succeeds without error"

このようにパイプをティーに接続するなどの他の方法としては、|ティー...)、次のコマンド(エコ...) とにかく実行されます(カール) 成功または失敗、考慮するので(ティー)は最後に実行されたコマンドです。カール)

関連情報