bash では、呼び出すfoo
と、そのコマンドからの出力が stdout に表示されます。
を呼び出すfoo > output
と、そのコマンドからの出力が指定されたファイル (この場合は「出力」) にリダイレクトされます。
出力をファイルにリダイレクトして stdout に表示する方法はありますか?
必要なコマンドの名前は次のtee
とおりです。
foo | tee output.file
たとえば、stdout のみを気にする場合:
ls -a | tee output.file
stderr を含めたい場合は、次のようにします。
program [arguments...] 2>&1 | tee outfile
2>&1
チャネル 2 (stderr/標準エラー) をチャネル 1 (stdout/標準出力) にリダイレクトし、両方が stdout として書き込まれるようにします。また、tee
コマンドの時点で指定された出力ファイルに送信されます。
さらに、ログ ファイルに追加tee -a
する場合は、次のように使用します。
program [arguments...] 2>&1 | tee -a outfile
$ program [arguments...] 2>&1 | tee outfile
2>&1
stderr および stdout ストリームをダンプします。
tee outfile
取得したストリームを受け取り、それを画面とファイル「outfile」に書き込みます。
これはおそらくほとんどの人が探しているものです。可能性のある状況は、一部のプログラムまたはスクリプトが長時間にわたって懸命に動作し、大量の出力を生成している場合です。ユーザーは、進行状況を定期的に確認したいと考えていますが、出力をファイルに書き出すことも望んでいます。
問題 (特に stdout ストリームと stderr ストリームが混在している場合) は、プログラムによってフラッシュされるストリームに依存していることです。たとえば、stdout へのすべての書き込みがフラッシュされず、stderr へのすべての書き込みがフラッシュされた場合、それらは出力ファイルと画面で時系列順から外れてしまいます。
プログラムが進行状況を報告するために数分ごとに 1 行または 2 行しか出力しない場合も問題です。このような場合、出力がプログラムによってフラッシュされない場合、何時間も出力がパイプを介してプッシュされないため、ユーザーは何時間も画面に出力を見ることさえできません。
更新:パッケージunbuffer
の一部であるプログラムはexpect
、バッファリングの問題を解決します。これにより、stdout と stderr が画面とファイルにすぐに書き込み、結合されて にリダイレクトされるときに同期が維持されtee
ます。例えば:
$ unbuffer program [arguments...] 2>&1 | tee outfile
Using tail -f output
should work.
このユースケースが私をここに連れてきたので、ボーナスの答え:
他のユーザーとしてこれを行う必要がある場合
echo "some output" | sudo -u some_user tee /some/path/some_file
エコーはあなたと同じように発生し、ファイルの書き込みは「some_user」として発生することに注意してくださいあなたのように。
ヒント: tee は、-a フラグを使用した追加もサポートしています。ファイル内の行を別のユーザーとして置き換える必要がある場合は、目的のユーザーとして sed を実行できます。
ティーはこれに最適ですが、これも仕事をします
ls -lr / > output | cat output