バイオインフォ道場、くまぞうです。
コマンドを実行したとき、画面とファイルの両方に出力したいときがあります。しかし通常は、画面出力するとファイルには保存されないし、ファイルにリダイレクトすると画面には表示されません。画面は結果確認として、ファイルへは実行結果のログとして、画面とファイルの両方に出力したい、そんな使い方です。そんなときは、tee
コマンドを使います。
スポンサーリンク
コマンドの使い方
基本的な使い方
あるコマンドを実行するとき、パイプ(|)でtee
へ繋ぎます。tee
コマンド名に続き、出力するファイル名を指定します。上書きしたくない場合は、別のファイルを指定するか、-a
オプションを指定して追記するようにします。
- lsの結果を画面とファイルに出力
$ ls aaa.txt bbb.txt $ ls | tee log.txt #teeを使って画面にもファイルにも出力する aaa.txt bbb.txt log.txt $ cat log.txt #logに保存されていることを確認 aaa.txt bbb.txt log.txt
よく使うオプション
- -a
ファイル出力で指定したファイルに上書きしないで追記します。
こんなときはどうする?
-
コマンドでエラーが出力された場合もファイルに保存できるの?
コマンドの出力には標準出力と標準エラー出力があります。
tee
コマンドを使った場合、ファイルに出力されるのは標準出力です。しかし、標準エラー出力と標準出力をファイルディスクリプタ1の出力にまとめることで、tee
コマンドのファイル出力へ反映することができます。標準エラー出力と標準出力は、2>&1
と指定することでまとめることができます。そして、tee
コマンドへパイプで繋ぐと、これら両方を画面とファイルに出力することが出来ます。$ ls --t | tee log.txt #エラーは画面出力されるが、ファイルには何も出力されない $ ls --t 2>&1 | tee log.txt ## エラーも画面とファイルの両方に出力される。 $ cat log.txt ls: オプション '--t' は曖昧です...
-
自作のスクリプトの出力も画面とファイルの両方に保存できるの?
自作のスクリプトの出力を、パイプを通して
tee
コマンドにつなげば、画面とファイルの両方に出力することができます。また、スクリプトで標準出力と標準エラー出力を使い分けた場合も、それらをまとめることで同様に出力することができます。hello.rb
#! /usr/bin/ruby puts "hello! >1" #標準出力 STDERR.puts "hello! >2" #標準エラー出力
自作スクリプト(hello.rb)の出力を画面とファイルの両方へ出力
$ ruby hello.rb #画面出力のみで確認 hello! >1 hello! >2 $ ruby hello.rb | tee log.txt #画面とファイルへ出力 $ cat log.txt #ファイルへは標準出力だけ出力される hello! >1 $ ruby hello.rb 2>&1 | tee log.txt #標準出力と標準エラー出力をまとめる $ cat log.txt #ファイルへは標準出力・標準エラー出力の両方が出力される hello! >1 hello! >2
[amazonjs asin=”4797382384″ locale=”JP” title=”Linuxコマンドブック ビギナーズ 第4版 (コマンドブックシリーズ)”]
スポンサーリンク