linux コマンド tee 画面とファイルの両方へ出力

バイオインフォ道場、くまぞうです。

コマンドを実行したとき、画面とファイルの両方に出力したいときがあります。しかし通常は、画面出力するとファイルには保存されないし、ファイルにリダイレクトすると画面には表示されません。画面は結果確認として、ファイルへは実行結果のログとして、画面とファイルの両方に出力したい、そんな使い方です。そんなときは、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
    

スポンサーリンク