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 |
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 |
ここで、Enterキーを押して空白行に進み、Ctrl-Dキーを押してcatを終了します。
前回と違い、まず、入力した文字が改めて表示されません。前回はcatは標準出力に情報を書き出していたので、画面に表示されていましたが、今回はcatからの出力がファイルにリダイレクトされたためです。リダイレクトは、sneakers.txtという名前を付けて作成した新しいファイルに対して行われました。
このファイルは、catを開始したときの現行ディレクトリにあります(ディレクトリ内のファイル一覧を画面で見たい場合には、lsと入力してください)。
プロンプトから次のように入力してcatを使用すると、
cat sneakers.txt |
そのファイルを読み込み、内容を画面に表示することができます。
ファイルを上書きしないでください | |
---|---|
出力をファイルにリダイレクトするときは、既存のファイルを上書きしがちなので、十分注意してください。置き換えたい場合を除き、作成するファイル名が既存のファイル名と同じにならないようにしてください。 |
今度は、別のファイルに出力をリダイレクトし、このファイルに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.txtとsneakers.txtの内容を結合して、saturdayという新しいファイルにリダイレクトしてみましょう(Figure 10-9に例を示してあります)。次のように入力します。
[newuser@localhost newuser]$ cat sneakers.txt home.txt > saturday |
ここで、私たちの作品をチェックしましょう。次のように入力します。
[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の内容が、新しいファイルに出力されたことを確認できます。
catによるファイルの結合 | |
---|---|
catを使用して短いファイルを作成し結合することは、Picoのようなテキストエディタの使用に代わる便利な方法です。 |
出力リダイレクトを使用すると、既存のファイルの終わりに新しい情報を追加することができます。>記号を使用する場合と同じように、シェルに対して、情報を標準出力以外に送るように指示することになります。
ただし、>>を使用した場合には、情報は置き換わるのではなく、追加されます。
実際に試してみる方がわかりやすいでしょう。2つの作成済みファイル(sneakers.txtとhome.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.txtとsaturdayの内容を比較して、それが同一であることを確認しましょう。比較を行うには、次のように入力します。
cat sneakers.txt; cat saturday |
最初にsneakers.txt、その後saturdayの内容が表示されます(Figure 10-10を参照)。
追加するときに誤って置き換えないでください | |
---|---|
出力を既存のファイルに追加したいときは、必ず2つの不等号(>>)を使う必要があります。間違って「>」を使うと、追加先のファイルが元々持っていた情報は消えてしまいます。 |
標準出力のリダイレクトだけではなく、標準入力についても同じようにリダイレクトを実行することができます。
標準入力リダイレクト記号の「<」を使用すると、コマンドの入力元としてファイルを使用するように、とシェルに伝えることになります。
作成済みのファイルを使用して、実際に試してみましょう。シェルプロンプトで以下のように入力します。
cat < sneakers.txt |
catコマンドとファイル名を不等号(<)でつないだため、catはsneakers.txtからの出力を読み込み、その内容を出力します。