第1章 初めてLinux/UNIX系OSにふれる
エンジニアのための最初の一歩(4)

シェルとコマンド(2)

 

1.2シェルとコマンド(その2)

パイプライン

 パイプラインは,次のように一つ以上のコマンドを‘|’で区切って並べたものです.

  command1 | command2 ...

 このように書くことで,シェルはcommand1の標準出力をパイプに切り替え,command2の標準入力につなぎます.この場合,それぞれのコマンドは別のプロセスとして実行され,パイプはプロセス間の通信機能を果たします.

 たとえば,wcコマンドは標準入力を読み,標準出力に行数,単語数,バイト数の順で出力しますが,

  $ ls / | wc

とすると,ルートディレクトリにあるファイルとディレクトリの数を数えることができます(正確には“.”で始まるファイルは含まれない).

 ここで不思議なのは,もしlsコマンドだけを実行すると図10に示すようになることです.

(図10)lsコマンドだけを実行した結果
 $ ls /

 bin    bootfs  etc      lib             mldinst  proc  sbin  usr

 boot  dev     home   lost+found   mnt      root  tmp  var

 図のように何段組かで表示されますが,この例では8段組で2行しかありません.以前のlsでは,1行に一つのファイルを表示していましたが,今のlsは標準出力が端末である場合だけは段組みをして表示します.

  $ ls / | cat

を実行すれば,lsの標準出力はパイプに切り替わっているので,1行に一つのファイルを表示するはずです.以前のlsでは,同様のことを段組みをするプログラムprを使って行っていました.

  $ ls / | pr -t -5

 prを使えば,段組をする機能はlsだけでなく他のプログラムの出力に対しても使うことができますが,これはlsに段組みをする機能を追加することとは本質的に異なります.

 通常,UNIXのコマンドは単純な仕事をする小さなプログラムです.このパイプの機能を使ってコマンドを組み合わせてより複雑な処理を行うことができます.したがって,パイプはUNIXのコマンドにとって非常に大きな役割を果たします.小さなプログラムならばバグも少なくて済み,また多くの人が組み合わせて使うことにより洗練されるということをUNIXは実証しています.

リスト

 リストは,一つ以上のコマンドまたはパイプラインを,;,&,&&,||で区切って書かれたもので,;,&または改行で終わります.;で区切られたコマンドは順次実行されます.たとえば,

  $ date;who

はコマンドdateを実行し,その処理が終了してからwhoを実行します.dateは現在の日付,時刻の出力,whoは現在ログインしているユーザーを,ユーザー名,端末名,日付の順に出力するコマンドです.

 また,&で区切るとシェルは初めのコマンドの終了を待たずに次のコマンドを実行します.たとえば,

  $ sleep 3;date

では3秒経過した後にdateが実行されます.sleepコマンドは,引き数で与えられた秒数待って終了するというコマンドです.ここで,;を&に変えて,

  $ sleep 3&date

とすると,dateはsleepの終了を待たずに実行され,すぐにプロンプトが返ってきます.;と&は同じ優先順位で,左から右へ評価されます.

 なお,&はコマンドの最後にも使うことができます.長い時間がかかるコマンドに&をつけて実行することで,シェルはそのコマンドの終了を待たずにコマンドをバックグラウンドプロセスとして実行します.たとえば,

  $ make World >& log &

はX Window System全体をビルドするときによく使われます.“>&”はリダイレクションの記号で,標準エラー出力を次の標準入力につなぎます.

 そして,&&と||により,左側のコマンドの結果によって右側のコマンドを実行するかを制御できます.&&は,左側のコマンドが成功したときに右側のコマンドが実行され,||は逆に左側のコマンドが成功したときには右側のコマンドを実行しません.たとえば,

  $ make bzImage && make modules

はカーネルとカーネルモジュールをビルドするときに使いますが,;で区切らず&&でコマンドを区切ってbzImage(カーネル)のビルドに失敗したときは,モジュールをビルドしないようにしています.&&と||は;と&よりも優先順位が高いので先のリストの最後に&をつけて,バックグラウンドプロセスとして実行することができます.また,&&と||は同じ優先順位で左から右へ評価されます.

複合コマンド

 シェルにはもう少し複雑な複合コマンドがあります.先のリストを,

  (リスト)

のように()でくくると,そのリストはサブシェルで実行されます.たとえば,

  $ (make World >& log;echo ^V^G)&

とすればmakeが終了したときにechoコマンドがベルを鳴らしてくれます.^Vはbashのコマンドライン編集の機能で,次のキー入力をそのままの入力とします.そのため,次のベルコードはそのままシェルへ渡されます.ここでは入力を示すために^Vを表示していますが,実際の端末上には表示されません.


Copyright 2000 
日樫 英孝/増田 佳泰/山岡 賢一/船木 陸議/ 羅 正華/森 友一朗/祐安 重夫/岩田 孝清/海老原 祐太郎/g新部 裕/ 齊藤 正伸 

新刊のご案内


Copyright 1997-2001 CQ Publishing Co.,Ltd.