catによるファイルの表示、リダイレクト、および追加

 Red Hat Linuxには、一覧を短くしておいたり、それらをまとめたり、しかもそれと同時に、システムに潜むパワーを少しばかり示したりすることができるユーティリティがあります。

 そのユーティリティの名前は、catで、ファイルを1つに結ぶという意味の「concatenate」の略です。

 catコマンドを使用して、あるファイル全体の内容を画面に表示することもできます(たとえば、cat filename.txtと入力してください)。ファイルがかなり短い場合には、catを使用すると便利です。しかし、ファイルが長くなると、画面上の表示がたちまちのうちにスクロールして見えなくなってしまいます。これは、catがファイル全体を表示するためです。

 しかし、catは、標準入力と標準出力という2つの重要な用語を学ぶのにも役に立ちます。

 標準入力と標準出力は、ユーザーとの間で入出力(I/Oとも呼ばれます)情報をやりとりします。プログラムが標準入力から情報を読み込む場合、デフォルトでは、それはつまりユーザーがキーボードから入力するということです。プログラムが標準出力へ情報を書き込む場合、デフォルトでは、それはつまり画面に情報が表示されるということです。

 catを起動して、この意味を確認しましょう。シェルプロンプトで次のように入力してみてください。

cat

カーソルが空白行に移動します。ここで、その空白行に、以下のように入力します。

stop by sneaker store

そして、Enterキーを押します。画面は、次のようになります。

[newuser@localhost newuser]$ cat
stop by sneaker store
stop by sneaker store

Figure 10-7. catを使った標準入力と標準出力の理解

 catへの標準入力からの入力を終了するためには、Enterキーを押してカーソルを空白行に移動します。そして、Ctrl-Dキーを押します。

 このcatコマンドの例から、標準入力と標準出力の定義が分かります。ユーザーがキーボード入力を行い(標準入力)、それが画面に表示されたわけです(標準出力)。

リダイレクトの使用

 リダイレクトとは、シェルが標準入力とみなすものや標準出力の出力先を、デフォルトのキーボード/ターミナル以外のものに変更させることを意味します。

 先ほど、標準入力と標準出力を説明するのにcatを使用しましたが、ここでもcatを使用して標準出力をリダイレクトする方法を説明します。

標準出力をリダイレクトするには、「>」記号を使用します。catコマンドの後ろ(標準出力へ書き出すその他のユーティリティやアプリケーションでも後ろに付けます)に「>」を配置すると、catからの出力は、「>」の後ろに書かれたファイル名に送られます。

 実際に試してみましょう。シェルプロンプトで、sneakers.txtという名前のファイルに出力をリダイレクトするように指示してcatコマンドを実行し、数行のテキストを入力します。次のように入力してください。

[newuser@localhost newuser]$ cat > sneakers.txt
buy some sneakers
then go to the coffee shop
then buy some coffee

Figure 10-8. 出力のファイルへのリダイレクト

 ここで、Enterキーを押して空白行に進み、Ctrl-Dキーを押してcatを終了します。

 前回と違い、まず、入力した文字が改めて表示されません。前回はcatは標準出力に情報を書き出していたので、画面に表示されていましたが、今回はcatからの出力がファイルにリダイレクトされたためです。リダイレクトは、sneakers.txtという名前を付けて作成した新しいファイルに対して行われました。

 このファイルは、catを開始したときの現行ディレクトリにあります(ディレクトリ内のファイル一覧を画面で見たい場合には、lsと入力してください)。

 プロンプトから次のように入力してcatを使用すると、

cat sneakers.txt

そのファイルを読み込み、内容を画面に表示することができます。

Cautionファイルを上書きしないでください
 

出力をファイルにリダイレクトするときは、既存のファイルを上書きしがちなので、十分注意してください。置き換えたい場合を除き、作成するファイル名が既存のファイル名と同じにならないようにしてください。

 今度は、別のファイルに出力をリダイレクトし、このファイルにhome.txtという名前を付けましょう。次のように入力してください。

[newuser@localhost newuser]$ cat > home.txt
bring the coffee home
take off shoes
put on sneakers
make some coffee
relax!

 ここで、空白行にカーソルを移動して、Ctrl-Dキーを押してcatを終了します。

 次のようにプロンプトに入力して、入力したテキストがファイルに書き込まれていることを確認します。

cat home.txt

 今度は、catを使って、home.txtsneakers.txtの内容を結合して、saturdayという新しいファイルにリダイレクトしてみましょう(Figure 10-9に例を示してあります)。次のように入力します。

[newuser@localhost newuser]$ cat sneakers.txt home.txt > saturday

Figure 10-9. ファイルの連結と出力のリダイレクト

 ここで、私たちの作品をチェックしましょう。次のように入力します。

[newuser@localhost newuser]$ cat saturday

 以下のような内容が表示されるはずです。

[newuser @localhost newuser]$ cat saturday
buy some sneakers
then go to the coffee shop
then buy some coffee
bring the coffee home
take off shoes
put on sneakers
make some coffee
relax!
[newuser @localhost newuser]$

 catによって、まずsneakers.txtが、次にhome.txtの内容が、新しいファイルに出力されたことを確認できます。

Tipcatによるファイルの結合
 

catを使用して短いファイルを作成し結合することは、Picoのようなテキストエディタの使用に代わる便利な方法です。

標準出力の追加リダイレクト

 出力リダイレクトを使用すると、既存のファイルの終わりに新しい情報を追加することができます。>記号を使用する場合と同じように、シェルに対して、情報を標準出力以外に送るように指示することになります。

 ただし、>>を使用した場合には、情報は置き換わるのではなく、追加されます。

 実際に試してみる方がわかりやすいでしょう。2つの作成済みファイル(sneakers.txthome.txt)を、catコマンドに追加出力記号を使って連結しましょう。home.txtの情報をsneakers.txtの情報に追加したい場合は、次のように入力します。

cat home.txt >> sneakers.txt

 次のように入力して、結果を確認してみましょう。

cat sneakers.txt

 既存のsneakers.txtの内容の後に、home.txtの内容が加えられています。

 ここで入力されたコマンドがシステムに指示した内容は、「home.txtファイルからの出力をsneakers.txtファイルへ追加しなさい」というものです。

 既存のファイルを使用して出力を追加することにより、ファイルを新規作成した場合と比較して、1つあるいは2つのステップ(とディスクの領域)を省くことができました。

 ファイルsneakers.txtsaturdayの内容を比較して、それが同一であることを確認しましょう。比較を行うには、次のように入力します。

cat sneakers.txt; cat saturday

 最初にsneakers.txt、その後saturdayの内容が表示されます(Figure 10-10を参照)。

Caution追加するときに誤って置き換えないでください
 

出力を既存のファイルに追加したいときは、必ず2つの不等号(>>)を使う必要があります。間違って「>」を使うと、追加先のファイルが元々持っていた情報は消えてしまいます。

Figure 10-10. コマンドの配列とファイルの比較

標準入力のリダイレクト

 標準出力のリダイレクトだけではなく、標準入力についても同じようにリダイレクトを実行することができます。

 標準入力リダイレクト記号の「<」を使用すると、コマンドの入力元としてファイルを使用するように、とシェルに伝えることになります。

 作成済みのファイルを使用して、実際に試してみましょう。シェルプロンプトで以下のように入力します。

cat < sneakers.txt

 catコマンドとファイル名を不等号(<)でつないだため、catsneakers.txtからの出力を読み込み、その内容を出力します。