web-dev-qa-db-ja.com

出力をbashに記録し、同時にターミナルで確認する方法は?

出力を確認する必要があるスクリプトがありますand結果をファイルに記録します。最も単純な例は次のとおりです。

$ update-client > my.log

コマンドの実行中にコマンドの出力を確認できるようにしたいのですが、ファイルに記録することもできます。私はstderrもログに記録するので、エラーストリームも確認しながらログを記録できるようにしたいと考えています。

23
Kristopher Ives
update-client 2>&1 | tee my.log

2>&1は標準エラーを標準出力にリダイレクトし、Teeはその標準入力を標準出力とファイルに送信します。

42

更新されたファイルを監視するには、tailを使用します。上記のコマンドの後に&を追加して元のプロセスをバックグラウンド化する上記のコマンドを実行した後は、

$ tail -f my.log

継続的に更新されます。 (ファイルの実行がいつ終了したかは通知されないため、ログに何かを出力して終了を通知できます。Ctrl-cでテールを終了します)

4
Cfreak

別のオプションは、スクリプト内からブロックベースの出力キャプチャを使用することです(これが正しい技術用語であるかどうかは不明です)。

#!/bin/bash 
{
  echo "I will be sent to screen and file"
  ls ~
} 2>&1 | tee -a /tmp/logfile.log

echo "I will be sent to just terminal"

私はより多くのコントロールと柔軟性を持ちたいので、私はこの方法を好みます。

4
rynop

そのためにteeコマンドを使用できます。

command | tee /path/to/logfile

シェルへの書き込みなしの同義語は次のとおりです。

command > /path/to/logfile

追加(>>)してシェルに出力を表示するには、-aオプションを使用します。

command | tee -a /path/to/logfile

パイプはstdoutのみをキャッチすることに注意してください。stderrへのエラーはT字型のパイプでは処理されません。 (stderrからの)エラーをログに記録する場合は、以下を使用します。

command 2>&1 | tee /path/to/logfile

つまり、コマンドを実行し、stderrストリーム(2)をstdout(1)にリダイレクトします。それはT字型アプリケーションでパイプに渡されます。

askubuntuサイトでこれについて学んでください

2
Anurag Jain