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