Red Hat Linuxには、一覧を短くしておいたり、それらをまとめたり、しかもそれと同時に、システムに潜むパワーを少しばかり示したりすることができるユーティリティがあります。
そのユーティリティとはcatで、ファイルを連結するという意味の「concatenate」の略です。
catコマンドを使用して、あるファイル全体の内容を画面に表示することもできます(たとえば、cat filename.txtと入力)。ファイルが小さい場合には、catを使用すると便利です。しかし、ファイルが大きくなると、画面上の表示がたちまちのうちにスクロールされて見えなくなってしまいます。これは、catがファイル全体を一気に表示するためです。
しかし、catは、標準入力と標準出力という2つの重要な用語を学ぶのにも役に立ちます。
標準入力と標準出力では、ユーザーとの間で入出力(I/Oとも呼ばれます)情報をやりとりします。プログラムが標準入力から情報を読み込む場合、デフォルトでは、それはつまりユーザーがキーボードから入力するということです。プログラムが標準出力へ情報を書き込む場合、デフォルトでは、それはつまり画面に情報が表示されるということです。
catを起動して、この意味を確認しましょう。シェルプロンプトから、次のように入力してください。
cat |
カーソルが空白行に移動します。ここで、その空白行に、以下のように入力します。
咳をしても一人 |
そして、Enterキーを押します。画面は、次のようになります。
[newuser@localhost newuser]$cat 咳をしても一人 咳をしても一人 |
catへの標準入力からの入力を終了するためには、Enterキーを押してカーソルを空白行に移動します。そして、Ctrl-D(多くのコマンドラインアプリケーションで入力終了を示すキー)を押します。
このcatコマンドの例から、標準入力と標準出力の定義がわかります。ユーザーがキーボード入力を行い(標準入力)、それが画面に表示されたわけです(標準出力)。
リダイレクトとは、シェルが標準入力とみなすものや標準出力の出力先を、デフォルトのキーボードやターミナル以外のものに変更させることを意味します。
先ほど、標準入力と標準出力の意味を説明するのにcatコマンドを使用しましたが、ここでも、標準出力をリダイレクトする方法をcatを使用して説明します。
標準出力をリダイレクトするには、「>」記号を使用します。catコマンドの後ろ「>」を付けると(標準出力へ書き出すその他のユーティリティやアプリケーションでも後ろに付けます)、catからの出力は「>」の後ろに指定したファイル名に送られます。
実際に試してみましょう。シェルプロンプトで、次のように入力してください。
[newuser@localhost newuser]$cat > haiku.txt やせ蛙 負けるな、一茶 ここにあり |
ここで、Enterキーを押して空白行に移動し、Ctrl-Dキーを押してcatを終了します。
前回との違いに注意してください(図10-9を参照)。まず、入力した文字は二重に表示されてはいません。今回はcatからの出力がファイルに出力(リダイレクト)されたためです。リダイレクトは、haiku.txtという名前を付けて作成した新しいファイルに対して行われました。
このファイルはcatを開始したときの現在のディレクトリにあります(ディレクトリ内のファイル一覧を画面で見るには、lsと入力してください)。
プロンプトから次のように入力してcatを実行すると、
cat haiku.txt |
そのファイルを読み込み、内容を画面に表示することができます。
![]() | ファイルを上書きしないでください |
|---|---|
出力をファイルにリダイレクトするときは、既存のファイルを上書きしがちなので、十分注意してください。ファイルを置き換えたい場合を除き、作成するファイルと同じ名前のファイルが存在していないことを確認してください。 |
今度は、別のファイルに出力をリダイレクトし、このファイルにtanka.txtという名前を付けましょう。次のように入力します。
[newuser@localhost newuser]$ cat > tanka.txt 天の原 ふりさけみれば 春日なる 三笠の山に 出でし月かも |
ここで、空白行にカーソルを移動して、Ctrl-Dキーを押してcatを終了します。
次のように入力して、もう1度ファイルの内容を調べます。
cat tanka.txt |
今度は、catを使って、tanka.txtとhaiku.txtの内容を結合し、haikutankaという新しいファイルにリダイレクトしてみましょう(図10-10の例を参照)。次のように入力します。
[newuser@localhost newuser]$ cat haiku.txt tanka.txt > haikutanka |
ここで、この結果を確認してみましょう。次のように入力します。
[newuser@localhost newuser]$ cat haikutanka |
以下のような内容が表示されるはずです。
[newuser @localhost newuser]$ cat haikutanka やせ蛙 負けるな、一茶 ここにあり 天の原 ふりさけみれば 春日なる 三笠の山に 出でし月かも [newuser @localhost newuser]$ |
catによって、まずhaiku.txtが、次にtanka.txtの内容が、新しいファイルに出力されたことを確認できます。
![]() | catによるファイルの結合 |
|---|---|
catを使用して短いファイルを作成し結合することは、emacsのようなテキストエディタの使用に代わる便利な方法です。 |
出力リダイレクトを使用すると、既存のファイルの終わりに新しい情報を追加することができます。「>」記号を使用する場合と同じように、シェルに対して、情報を標準出力以外に送るように指示することになります。
ただし、「>>」を使用した場合には、情報は置き換わるのではなく、追加されます。
実際に試してみる方がわかりやすいでしょう。2つの作成済みファイルhaiku.txtとtanka.txtを、catコマンドに追加出力記号を指定して連結しましょう。tanka.txtの情報をhaiku.txtの情報に追加するには、次のように入力します。
cat tanka.txt >> haiku.txt |
次のように入力して、結果を確認してみましょう。
cat haiku.txt |
既存のhaiku.txtの内容の後に、tanka.txtの内容が加えられています。
ここで入力したコマンドがシステムに指示した内容は、「tanka.txtファイルからの出力をhaiku.txtファイルに追加しなさい」というものです。
既存のファイルを使用して出力を追加することにより、ファイルを新規作成した場合と比較して、いくつかのステップ(とディスクの領域)を省くことができました。
ファイルhaiku.txtとsaturdayの内容を比較して、同じであることを確認しましょう。比較を行うには、次のように入力します。
cat haiku.txt; cat haikutanka |
最初にhaiku.txt、その後にhaikutankaの内容が表示されます(図10-11を参照)。
![]() | 追加と置き換え |
|---|---|
出力を既存のファイルに追加する場合は、必ず2つの不等号(>>)を使用してください。間違って「>」を使うと、追加先のファイルにあった情報は消えてしまいます。 |
標準出力のリダイレクトだけではなく、標準入力についても同じようにリダイレクトを実行することができます。
標準入力リダイレクト記号の「<」を使用すると、コマンドの入力元としてファイルを使用するように、とシェルに伝えることになります。
作成済みのファイルを使用して、実際に試してみましょう。シェルプロンプトで以下のように入力します。
cat < haiku.txt |
catコマンドとファイル名を不等号(<)でつないだため、catはhaiku.txtからの出力を読み込み、その内容を出力します。