こんにちは。ADN事業部のy_yamadaです。
サーバーへターミナルでログインしての作業中、ログを記録したいことがあると思います。
単純な方法としてWindowsならTeraTerm、MacならTerminalの画面記録を保存するのが楽でいいです。
でもコマンドの出力は長いことが多かったり後でじっくり読みたかったりgrepでフィルタリングしたいこともあります。 そういうときにはリダイレクトの出番です。 たとえば以下のような処理があったとします。
for ((i=0;i<1000;i++)) do date; echo "いろいろな処理"; done
上記の処理をログに残すにはリダイレクトを使います。
for ((i=0;i<1000;i++)) do date; echo "いろいろな処理"; done > work.log 2>&1
- 「> work.log」という記載でコマンドの出力をwork.logというファイルへ書き出します。これは「1> work.log」の省略形です。1は標準出力、つまり正常系への出力です。
- 「2>&1」という記載で標準エラー出力を標準出力へリダイレクト(転送)します。エラーが起きた時の出力も記録したい時に使います。
これでログが取れるようになりましたが、その反面、何も表示されないので作業がどこまで進んだか分かりません。 やっつけな解決策としては、別のターミナルを立ち上げて以下のコマンドを入力すればリアルタイムに見ることができます。
tail -f work.log
tailコマンドはファイルの末尾を見ることができ、オプション「-f」を指定しておくとファイルにデータが追加されたらリアルタイムに表示されます。
でも、ターミナルを別に立ち上げるのは面倒くさいですよね。TerminalやTeraTermも複数タブに対応しているらしいですが切り替えるのはやっぱり面倒くさい。 ログを保存したい、ターミナルに表示もさせたい、そんな時にはteeコマンドの出番です。
for ((i=0;i<1000;i++)) do date; echo "いろいろな処理"; done | tee work.log
「>」や「<」のリダイレクトではなくパイプ「|」で出力を渡しているのがポイントです。 ターミナルでいろいろ試したいことがあればご活用ください。
また、よく使われるコマンドには似たコマンド、関連するコマンド、反対のコマンドがあるのでそれを知っておくと手間が省けたりします。
- リダイレクトとパイプ
- tailとhead、tee
- sleepとwatch
- cpとrm、mv
- diffとpatch
- bgとfg、jobs
- psとkill、top
ではではLet's Happy Hacking!