Linux
 Computer >> コンピューター >  >> システム >> Linux

Linuxのteeコマンド使い方ガイド|画面表示とファイル保存を同時に実現

Linuxシェルでパイプやリダイレクトを使っているなら、teeコマンドの出番もきっとあるはずです。teeは「標準出力に表示しながら、同時にファイルにも書き込む」ことができる便利なユーティリティです。この記事では、teeコマンドの基本操作から、sudoとの組み合わせ、追記モード、エラー出力の扱い方まで、実例を交えながら詳しく解説します。

teeコマンドとは何をするもの?

まず、次のようなコマンドを見てみましょう。

ls

このコマンドは、現在のディレクトリの内容を表示します。つまり、標準出力(stdout)へ出力するわけです。標準出力とは通常、画面、正確には仮想端末のディスプレイのことです。

一方、次のようなコマンドではどうなるでしょうか。

ls > file123

この場合、画面には何も表示されません。>記号によって、すべての出力がstdoutではなくファイルへリダイレクトされるためです。file123には、本来画面に表示されるはずだった内容が書き込まれます。

では、ディレクトリの内容を画面に表示しつつ、同時にファイルにも保存したい場合はどうすればよいのでしょうか。通常なら2つのコマンドを実行する必要がありますが、teeを使えば1回で両方を実現できます。

ls | tee file123

同じコマンドを2回実行すればいいのに、なぜteeを使うのか?

上の例のように、lsを普通に実行してから、もう一度リダイレクト付きで実行できるなら、teeは不要に思えるかもしれません。しかし、出力がその瞬間にしか得られない場面に遭遇することがあります。

たとえば、システムの問題を診断するシナリオを想像してください。diagnose | tee error.logを実行するとします。表示されるエラーはその実行時にしか現れないかもしれません。エラーを画面に表示してテスト中の状況を確認しながら、同時にファイルにも保存しておけば、後で見返したり、フォーラムに貼り付けて質問したりできます。

もうひとつ、teeが必要になるよくあるケースがあります。それは、rootユーザーしか読み書きできない場所にコマンドの出力を書き込みたい場合です。次のコマンドは失敗します。

/sbin/blkid > /root/somefile

「じゃあsudoを使えばいい」と思うかもしれません。ところが、意外なことに次のコマンドも失敗します。

sudo blkid > /root/somefile

これはなぜでしょうか。sudo blkidが実行された後も、ログインしているのは通常の非rootユーザーのままだからです。シェル(通常はbash)は、あなたの一般ユーザー権限で/root/somefileへの書き込みを試みるため、権限不足で失敗してしまいます。この問題を解決するのがteeです。

/sbin/blkid | sudo tee /root/somefile

このように書くと、blkidの出力がパイプ経由でteeに渡され、root権限で動作しているteeがファイルへの書き込みを行ってくれます。

テキストの追記とエラー出力のリダイレクト

teeはシンプルながら有用なコマンドで、多くの場合はcommand | tee somefileという基本形で十分です。しかし、知っておくべき重要なポイントが2つあります。

1つ目は、teeはデフォルトでは常にファイルを上書きするということです。まず

ls | tee somefile

を実行し、続けて

ls /tmp | tee somefile

を実行すると、2番目のコマンドがsomefileの内容を上書きし、最後に実行したコマンドの出力だけが残ります。この挙動を変えて、上書きではなく追記にしたい場合は、-aオプションを使用します。

ls | tee -a somefile

2つ目は、すべての出力が同じではないということです。エラーメッセージは別扱いされており、画面には表示されますが、stdoutとしては扱われないため、teeでは捕捉されません(エラーはstderrとして扱われます)。grepを例に見てみましょう。

grep -r L2TP /etc | tee somefile

このコマンドを実行すると、次の画像のような表示になります。

Linuxのteeコマンド使い方ガイド|画面表示とファイル保存を同時に実現

「Permission denied」メッセージはstderrに書き込まれます。stdoutに書き込まれるのは、ハイライト表示された検索結果のテキストだけです。そのため、somefileの内容は下の画像のようになります。

Linuxのteeコマンド使い方ガイド|画面表示とファイル保存を同時に実現

grepでテキストを検索するようなケースでは、エラーメッセージがファイルにリダイレクトされない方がむしろ便利です。不要なデータでファイルが埋め尽くされるだけで、本当に欲しいのは見つかった検索結果だけだからです。しかし、エラーメッセージも記録したい場合は、stderrをstdoutにリダイレクトする2>&1を使用します。

grep -r L2TP /etc 2>&1 | tee somefile

このコマンドを使えば、somefileにエラーメッセージも含まれるようになります。

まとめ

このチュートリアルを読めば、teeコマンドを最大限に活用するために必要な知識はすべて身についたはずです。もしteeの使い方で困った状況に遭遇したら、下のコメント欄でお気軽にお知らせください。お手伝いできるかもしれません。

  1. Linuxのssコマンドでネットワーク接続を監視する方法【基本から実践テクニックまで】

    Linuxを使っていると、ネットワークの状態をもっと詳しく知りたい場面に必ず出会います。そうしたニーズに応えられるツールは数多く存在しますが、中には扱いが複雑なものもあります。ssコマンドは多くのLinuxマシンに標準でインストールされているため、その使い方を知っておくと非常に便利です。ssコマンドとは?2文字だけのコマンド名は一見謎めいて見えますが、実際はとてもシンプルです。多くのLinux/Unixコマンドと同じように、コマンド名はその機能を表す略語になっています。「ss」は「Socket Statistics(ソケット統計)」の略です。Socket Statisticsは、従来のnets

  2. Linuxのwatchコマンドの使い方と実用例をわかりやすく解説

    Linuxのwatchコマンドは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるためのツールです。コマンドの出力が時間とともにどう変化するかをリアルタイムで監視したい場合に非常に便利です。この記事では、watchコマンドの基本的な使い方と、覚えておくと役立つ実用的な例を紹介します。 watchコマンドの基本構文 watchコマンドの構文は以下のとおりです。 watch オプション コマンド 各要素の意味は次のとおりです。 オプション: 後述の表から選択したオプションを指定します。watchコマンドのデフォルト動作を変更できます。 コマンド: watchが繰り返し実行