Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linuxのteeコマンド徹底解説 – シェル出力を分割してファイルと画面に同時保存する方法【実例付き】

Linuxのシェル(コマンドライン)で使える tee コマンドは、アプリケーションの出力を「分岐」させるためのコマンドです。出力をファイルに保存すると同時に、標準出力(STDOUT)(コンソールや別のアプリケーション)にも送ることができます。この記事では、teeコマンドの基本的な使い方を実例とともに解説します。

tee というコマンド名は、配管工事で使われるT字型の継ぎ手(T字管)に由来しています。1つの水源から水を2方向へ分流させるパイプのようなイメージです。

teeコマンドの構文

tee は目的も構文もシンプルなコマンドです。

tee OPTIONS FILE

各要素の意味は以下のとおりです。

  • OPTIONS:後述の表にあるオプションを指定します
  • FILE:出力を保存したいファイルのパスを指定します
  • 入力はパイプまたはリダイレクトで tee に渡す必要があります。渡さなければ処理するデータがありません
    • 標準入出力のリダイレクトを使って渡します。具体例は後述します
  • tee は受け取ったデータを、指定された FILESTDOUT(標準出力)の両方に出力します
    • デフォルトではコンソールに表示されますが、他のアプリケーションへリダイレクトすることも可能です

主なオプション

teeコマンドでよく使われるオプションは以下のとおりです。

オプション 説明
-a, --append 指定したFILEに追記する(上書きしない)
-i, --ignore-interrupts 割り込みシグナルを無視する

その他のオプションやエラーの診断方法については、次のコマンドでユーザーマニュアルを確認できます。

man tee

teeコマンドの使用例

ここでは、tee の基本的な使用例をいくつか紹介します。

いずれの例でも、与えられたテキストをそのまま出力する echo コマンドを使用しています。

コマンドの出力を表示しながら新規ファイルに保存する

echoコマンドの出力をteeにパイプで渡すと、ファイルに保存されると同時にコンソールにも出力されます。

echo "hello!" | tee hello.txt

なお、hello.txt というファイルがすでに存在する場合は上書きされる点に注意してください。

コマンドの出力を既存ファイルに追記して表示する

先ほどの例と同じ動作ですが、-a オプションを付けることで既存ファイルを上書きせず、末尾に追記します。

echo "hello again!" | tee -a hello.txt

複数のファイルに出力を保存・追記する

スペースで区切ることで、複数のファイルを一度に指定できます。

echo "hello several files!" | tee hello1.txt hello2.txt hello3.txt

teeの出力をリダイレクト/パイプする

teeの標準出力は、さらにパイプやリダイレクトで他のコマンドにつなぐこともできます。次の例では、echoの出力を hello.txt に保存したうえで、その出力はコンソールではなく grep コマンドに渡されます。

echo "hello!" | tee hello.txt | grep hello

この例では、テキスト検索用のコマンドである grep を使って、teeからの出力の中から "hello" という文字列を検索しています。

割り込みを無視する

-i オプションで割り込み(Ctrl + C などによるコマンドの中断)を無視すると、よりクリーンな出力が得られることがあります。

echo "hello!" | tee -i hello.txt

sudoと組み合わせたteeコマンドの使い方

sudo コマンドを使うと、rootとしてログインしなくてもroot権限でコマンドを実行できます。日常的によく使われる便利なコマンドです。

しかし、次のように書いても意図どおりには動作しません。リダイレクト(>)は sudo コマンド自身が実行するものではないためです。

sudo echo "hello!" > /root/hello.txt

これは権限エラーで失敗します。/root ディレクトリへの書き込みにはroot権限が必要ですが、sudoが適用されるのは echo コマンドのみで、その後に続くリダイレクトには適用されないためです。

この問題を回避する定番のテクニックが、tee コマンドを使う方法です。

echo "hello!" | sudo tee /root/hello.txt

この方法が機能するのは、echoコマンドの出力が tee に渡され、その tee 自体が sudo によって管理者権限で実行されているためです。実際にファイルへの書き込みを行うのは tee なので、正しく /root/hello.txt へ出力を保存できます。

  1. Linuxシェルスクリプトで学ぶ数学処理 – 第4回:四則演算から素数判定まで

    今回は、数学と数値計算の視点からシェルスクリプトを学んでいきます。前回の記事ではやや複雑なスクリプト(簡易電卓)を紹介しましたが、読者にとっては少し理解しづらかったかもしれません。そこで今回は、内容を小さな単位に分割し、シェルスクリプトのもうひとつの実用的な側面を段階的に習得できるよう構成しました。 これまでの連載記事 この記事までに公開されているシェルスクリプト入門シリーズは以下の3本です。まだお読みでない方は、先に目を通しておくと理解がより深まります。 Linuxシェルと基本のシェルスクリプトを理解する – 第1回 シェルプログラミングが学べる5つのシェルスクリプト – 第2回 Linu

  2. Linuxのlsコマンド徹底解説!ファイルとディレクトリを一覧表示する方法

    Linuxのlsコマンドは、多くのユーザーが最初に使うことになる基本コマンドの一つです。この記事では、lsコマンドの基本的な使い方と、実務で頻繁に利用されるオプションについてわかりやすく解説します。 筆者が普段よく使うオプションの組み合わせは以下のとおりです。 ls -Zaltrh それでは、各オプションの意味をひとつずつ掘り下げながら、この組み合わせがなぜ便利なのかを説明していきます。 lsコマンドの基本構文 # ls [OPTION] [FILE] OPTIONS: [-a] 「.」または「..」で始まる隠しエントリを無視しない [-h] -lと併用した場合、サイズを人間が読みやすい形式で