1307

bash では、呼び出すfooと、そのコマンドからの出力が stdout に表示されます。

を呼び出すfoo > outputと、そのコマンドからの出力が指定されたファイル (この場合は「出力」) にリダイレクトされます。

出力をファイルにリダイレクトして stdout に表示する方法はありますか?

4

11 に答える 11

1864

必要なコマンドの名前は次の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
于 2009-01-07T01:48:08.943 に答える
542
$ program [arguments...] 2>&1 | tee outfile

2>&1stderr および stdout ストリームをダンプします。 tee outfile取得したストリームを受け取り、それを画面とファイル「outfile」に書き込みます。

これはおそらくほとんどの人が探しているものです。可能性のある状況は、一部のプログラムまたはスクリプトが長時間にわたって懸命に動作し、大量の出力を生成している場合です。ユーザーは、進行状況を定期的に確認したいと考えていますが、出力をファイルに書き出すことも望んでいます。

問題 (特に stdout ストリームと stderr ストリームが混在している場合) は、プログラムによってフラッシュされるストリームに依存していることです。たとえば、stdout へのすべての書き込みがフラッシュされ、stderr へのすべての書き込みフラッシュされた場合、それらは出力ファイルと画面で時系列順から外れてしまいます。

プログラムが進行状況を報告するために数分ごとに 1 行または 2 行しか出力しない場合も問題です。このような場合、出力がプログラムによってフラッシュされない場合、何時間も出力がパイプを介してプッシュされないため、ユーザーは何時間も画面に出力を見ることさえできません。

更新:パッケージunbufferの一部であるプログラムはexpect、バッファリングの問題を解決します。これにより、stdout と stderr が画面とファイルにすぐに書き込み、結合されて にリダイレクトされるときに同期が維持されteeます。例えば:

$ unbuffer program [arguments...] 2>&1 | tee outfile
于 2011-08-28T05:38:20.797 に答える
23

主にZoredache ソリューションを使用できますが、出力ファイルを上書きしたくない場合は、次のように -a オプションを付けて tee を記述してください。

ls -lR / | tee -a output.file
于 2014-08-15T00:18:41.663 に答える
18

追加するもの...

パッケージ unbuffer には、fedora および redhat unix リリースの一部のパッケージでサポートの問題があります。

悩みはさておき

以下は私のために働いた

bash myscript.sh 2>&1 | tee output.log

ScDFに感謝し、あなたの意見のおかげで多くの時間を節約できました..

于 2015-06-26T10:10:45.980 に答える
9

Using tail -f output should work.

于 2009-01-07T01:50:22.870 に答える
4

このユースケースが私をここに連れてきたので、ボーナスの答え:

他のユーザーとしてこれを行う必要がある場合

echo "some output" | sudo -u some_user tee /some/path/some_file

エコーはあなたと同じように発生し、ファイルの書き込みは「some_user」として発生することに注意してくださいあなたのように。

ヒント: tee は、-a フラグを使用した追加もサポートしています。ファイル内の行を別のユーザーとして置き換える必要がある場合は、目的のユーザーとして sed を実行できます。

于 2015-10-22T17:55:42.220 に答える
-16

ティーはこれに最適ですが、これも仕事をします

ls -lr / > output | cat output
于 2009-01-07T02:47:44.750 に答える