リダイレクトについて

ここでは、I/Oリダイレクションと呼ばれる、多くのコマンドラインプログラムで使われている、ある特徴について深掘りしていきます。
これまで見てきたように、lsなど多くのコマンドでは、その出力結果をディスプレイ上で確認することができます。
しかしながら、この場合はそれは当てはまりません。
いくつかの特別な表記法を用いることによって、多くのコマンドの出力先を別のファイルやデバイス、更には他のコマンドの入力先に変えることすら可能になります。

標準出力

多くのコマンドラインプログラムでは、その結果を装置に送ることによって表示するが、これを標準出力と呼びます。
デフォルトでは、標準出力はそのコンテンツを直接ディスプレイに送ります。
標準出力をファイルにリダイレクトするには、”>”を下のように用いればよいです。

この例では、lsコマンドの実行結果が”file_list.txt”という名前のファイルに出力されます。
lsコマンドの出力先がファイルへと変わるので、ディスプレイには何も表示されません。

上のコマンドが繰り返される度に、”file_list.txt”の中身はlsコマンドの出力結果で上書きされます。
新しい出力結果をファイルに加えたければ、”>>”を以下のように用います。

その結果が付け加えられるとき、新しい部分はファイルの末尾に追加され、コマンドが繰り返される度にファイルの中身が長くなっていきます。
もし出力結果を加えようとしているファイルが存在しない場合、そのファイルが新たに生成されます。

標準入力

設備からの入力を受け入れる多くのコマンドを、標準入力を呼びます。
デフォルトでは、標準入力はその中身をキーボードから受け取りますが、標準出力のようにそれは変更可能です。
キーボードの代わりにファイルからの標準出力先を変えるには、”<”を以下のように用いればよいです。

上の例では、sortコマンドという”file_list.txt”のコンテンツを調査するコマンドを使っています。
標準出力先は変更されていないので、結果はディスプレイ上に表示されます。
出力先を他のファイルに変更するには、以下のように入力します。

ここでわかるように、コマンドはその入力と出力先の双方を変更できます。
リダイレクションの順番は、関係ないことに気をつけてください。
唯一必要となるのは、”>”と”<”いう2つのオプションが、コマンド内の他のオプションの後になければならないということです。

パイプライン

I/Oリダイレクションにおける最も便利で強力なのは、複数のコマンドを組み合わせて使うことであり、それはパイプラインと呼ばれています。
パイプラインを使えば、1つのコマンドの標準出力が他の標準入力に入ります。
ここで、著者のお気に入りの例を紹介しておきましょう。

この例では、lsコマンドの出力結果がlessコマンドの中に入ります。
“| less”を使うことによって、あらゆるコマンドにスクロールできる出力結果を持たせることが可能になります。

コマンドを組み合わせることによって、素晴らしい結果を得ることが可能になります。
トライすべき例を、いくつか下に示しておきましょう。

・ls -lt | head — カレントディレクトリ内で最も新しい10個のファイルを表示します。
・du | sort -nr — 各ディレクトリでどれぐらいの容量が使われているかを、大きい方から順番に表示します。
・find . -type f -print | wc -l — カレントワーキングディレクトリ内の全てのファイルの数と、全てのサブディレクトリを表示します。

フィルタ

パイプラインで頻繁に使われる、ある種のプログラムを、フィルタと呼びます。
フィルタは標準入力からデータを受け取り、それを標準出力に送る機能のことです。
ここでは、フィルタとして動作するよく知られたコマンドを紹介しておきます。

・sort — 標準入力を分類し、その結果を標準出力へ出力します。
・uniq — 標準入力からのデータの流れを分類し、重複を取り除きます。
・grep —標準入力と出力からのデータを受け取り、 ある特定の文字列が含まれていないか調査します。
・fmt — 標準入力からのテキストを読み込み、整形して標準出力に出力する。
・pr — 標準入力からのテキストを、印刷前にヘッダとフッタなど必要な形に整えます。
・head — 入力されたものの最初の数行を抜き出します。ヘッダを取り出す場合には、便利なコマンドです。
・tail — 入力されたものの、最後の数行を抜き出します。ログファイルの最新部分が必要な場合には、便利なコマンドです。
・tr — 文字を変換します。大文字小文字を変換する際や、拡張子を変更したりする際にも使えます。
・sed — ストリームエディターのことです。trコマンドよりも、柔軟にテキスト変換を行うことができます。
・awk — フィルタを手軽に作成するためのプログラミング言語です。