プログラムの出力をリダイレクトし、それでも標準出力に送る方法はありますか?


24

はい。プログラムの出力をファイルにリダイレクトしたい場合は、このようなことをします

prog > file

stdoutとstderrの両方をそのファイルにリダイレクトしたい場合は、

prog > file 2>&1

出力をファイルに送信する場合は、これで十分です。しかし、出力をファイルに送りながら、まだstdout / stderrに送りたい場合はどうでしょうか?そのため、出力はファイルに保存されますが、プログラムの実行中にコンソールで確認できます。それを行う方法はありますか?もしそうなら、どのように?


用語:ターミナルに行きます。 stdoutはファイル記述子1でありfoo > some_file、書き込み専用で開かれたファイル記述子some_fileがfooの標準出力であることを意味します。stdoutは常にstdoutになります。
ピーターコーデス

回答:


39

teeこの目的のために存在します。ファイル名引数を取り、stdinから読み取ったデータをstdoutとファイルの両方に書き込みます。

$ prog 2>&1 | tee file

10
bash 4の追加の可愛さ:prog |& tee file
東武

1
また...名前付きパイプと「ファイル」を置換することができます
ケビン・カントゥ

@KevinCantu:名前付きパイプは単なるファイルの一種です。これはすべてがファイルであるUnixです。prog |& tee /dev/tty > fileパイプラインの途中で役立つ場合もあります。たとえばfoo |& tee /dev/tty | sed 's/.*\r//' > foo.log、端末でステータスラインの進行状況の更新を確認し、ログファイルからフィルターで除外します。または、その時点でデータを表示することにより、一緒にハッキングしているパイプラインをデバッグするために使用します。
ピーターコーデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.