コラム 標準入力?標準出力?

 Linux では、すべてのデバイスをファイルとして扱います。一般的な入力を行う装置であるキーボードや画面出力を行うディスプレイも、Linux 上では特殊なファイルとして扱われています。パソコンを操作するということは、キーボードというデバイスから入力を行い、ディスプレイというデバイスへ出力することを意味しているわけです。

 コマンドを実行する場合、基本的には、入力元となるファイルと出力先となるファイルの二種類が必要になります。一部のコマンドで見られる、どちらか一方しか指定しなかったり、あるいはどちらも指定しないものは、コマンド自身が、指定されなかったときにみなす値(これをデフォルトと呼びます)を持っているためです。

 入力と出力にも、デフォルトは存在します。それが、標準入力と標準出力と呼ばれるもので、そのデバイス名は、con で示されます。con は入力と出力で異なるデバイスを持ちます。標準入力は、キーボードを指し、標準出力はディスプレイを指しています。コマンドは、標準入力から読み込まれ、その実行結果を標準出力に書き出している、と言い替えることも出来ます。

 さて、標準入力と標準出力があると、何がうれしいのでしょうか?

 ls コマンドは、引数は一つだけしか持ちません。この引数は、表示対象であるパス名を指定する(デフォルトはカレントディレクトリを指しています)だけで、出力先は特に指定しません。これは当然で、ls コマンドはファイルリストを表示するコマンドですから、出力先は、使用者にみせるため、ディスプレイに他ならないわけです。デフォルトとして、標準出力が存在していなかったとすれば、いちいちコマンドの出力先として、con を引数に含める必要が表示ます。また、コマンドを入力するということに入力元を設定しなければならないとしたら、それはどうやって入力すればよいのでしょうか?標準入力・標準出力という考え方があるおかげで、このようなことを悩む必要がなくなっている、といえるわけです。

 デフォルトは、特に指定を行わなかった場合に利用される、と先に書きました。ということは、指定をすれば、使用する入力元や出力先を変更することができます。例えば、定型的な返答を返すコマンドを実行する場合、キーボードから入力する代わりに、入力する文字等を保存しておいたファイルを使うことができることになります。また、画面で読みきれないほどのメッセージを出力するような場合に、画面へ出力させる代わりに、ファイルへ保存させることができるわけです。入力先を変更することで、作業を半自動で行うことができるようになり、出力先を変更することで、作業結果を後から確認することができるわけです。

 入出力先を変更することをリダイレクトと呼びます。入力先を変更する際には『<』を使用します。出力先を変更する際には『>』を使用します。

 例

  ls > filelist         ls の出力を filelist というファイルへ書き出す。
  rm hogehoge < echo y  rm の問い合わせに y と入力する。 

 特殊なリダイレクトとして、パイプがあります。パイプとは、『|』(表示するフォントによっては、真ん中に空白が挟まれる場合があります)で示されるもので、パイプの左側のコマンドの実行結果を作業ファイルに落として、右側のコマンドに対する入力とする、という機能を持ちます。リダイレクトを使っても実現可能ですが、リダイレクトで行う場合には、作業ファイルを明示的に指定する必要があり、作業後もファイルが残ってしまうこともあり、後でお片付けをする必要があります。パイプを使えば、OS が作業ファイルについてはよきに計らってくれるため、作業終了後には自動で消去されます。

 例

  dmesg | less                          dmesg コマンドの出力を less を使って一画面ずつ表示する。

  tail -100 /var/log/messages | less    syslog をファイルの末尾から 20 行取り出し less を使って表示する。

  dmesg | grep eth                      dmesg コマンドの結果から、ethernet デバイス(eth)を抽出(grep)する。

 リダイレクトは複数利用したり、パイプと組み合わせて使用することができます。

   cat /var/log/message | grep named | less  
  syslog から named を含まれる行を抽出し、その結果を less を使って表示する。

 実はリダイレクトは、Windows のコマンドプロンプトでも利用可能です。使い方は、上記とまったく同じです。