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

シェルとコマンド(1)

 

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

 UNIXの特徴の一つとしてシェルがあります.シェルはユーザーから入力されたコマンドを解釈して実行するプログラムです.UNIXの基本方針は,簡潔さと一貫性です.また,小さなモジュールのプログラムを組み合わせて必要な機能を実現するのがUNIXの流儀なので,シェルは必要不可欠な存在です.つまり,コマンドやユーザーアプリケーションを実行する際に「仲介する」ためのプログラムです.シェルというプログラムがユーザーにとってどのような位置にいるのかを図7に示します.

 

(図7)

ユーザーから見えるLinuxの姿

 ここでは,Linuxで標準的に使われるシェルbashを例に,UNIXの特徴的な機能である標準入出力,パイプ,プロセス間通信,ファイルシステムなどについて説明します.DOSにおいても一部の機能は実現されていますが,できることはシェルのほうが多く,より柔軟な使い方が可能になっています.しかし,数が多いので覚えにくいというのも事実でしょう.ここでは,各コマンドよりも,シェルの使い方を中心に解説します.

コマンドラインの構造

 bash(Bourne Again SHell)はその名のとおり,UNIXの標準シェルであるBourne shellの上位互換のシェルです.Bourne shellの持つすべての組み込みコマンドが利用可能で,評価と引用の規則はPOSIXの規格IEEE Std 1003.2注3に基づいています.

単純コマンド

 単純コマンドは,空白で区切られたいくつかの単語で構成されます.最初の単語は,コマンド名として解釈され実行されます.残りの単語は,そのコマンドの引き数として渡されます.

  command arg1 arg2 ...

 ここでは,lsコマンドを例に説明します.lsコマンドは,引き数に指定されたディレクトリの内容を表示します.たとえば,

  $ ls /

とすることで,ルートディレクトリの内容を表示します.なお,これ以後,$はシェルのプロンプトを示します.

 UNIXのファイルシステムは,/を始まりとする階層構造のディレクトリになっていますが,ここで引き数を省略し,

  $ ls

を実行するとどうなるでしょうか.

 lsコマンドは,引き数が省略された場合には現在のディレクトリ(カレントディレクトリ)の内容を表示します.

 lsコマンドには多くのオプションが指定できます.オプションはコマンド名のすぐ後に置かれる引き数で,コマンドの動作を標準とは少し変える働きをします.UNIXでは,オプションは - 記号に続くアルファベット1文字で通常表しますが,GNUで開発されたプログラムでは--に続く単語でオプションを指定する場合が増えています.

 オプションの例としては,たとえば“-l”がありますが,

  $ ls -l /

とすることで,ファイルタイプ,パーミッション,リンク数,オーナー,グループ,バイト数,ファイルが変更された時刻が表示されます.

標準入出力とリダイレクション

 UNIXのコマンドの多くはファイル名などの引き数が省略されると,標準入力を読み込み,結果を標準出力へ出力します.エラーを出力する場合は標準エラー出力へ出力します.この標準入力,標準出力,標準エラー出力とは,普通は端末に割り当てられており,具体的にはキーボードが標準入力,ディスプレイが標準出力と標準エラー出力です.

 lsコマンドは,結果を端末上に出力するわけですが,lsというプログラムの中で端末が指定されているのではなく,lsは標準出力へ出力します.普通にシェルからlsを実行したときには標準出力は端末に割り当てられているので,結果的に端末に表示されます.そして,シェルでは,この標準入出力を切り替えることができます.たとえば,lsの結果をjunkというファイルに出力するには,

  $ ls >junk

と書きます.単純コマンドの場合,“>junk”はどこに置いても構いません.したがって,上のコマンドは,

  $ >junk ls

と同じ意味をもちます.重要なことは,“>junk”がコマンドlsの引き数ではなく,シェルが解釈して標準入出力を切り替えるという点です.そのため,標準入出力を使っているコマンドはどれでもシェルによって標準入出力を切り替えることができます.この機能/操作をリダイレクションと言います図8表1

 

(図8)

リダイレクションの概念

 

 

(表1)

bashのリダイレクション記号

 リダイレクションの例をもう一つ挙げておきます.catコマンドは,引き数で指定されたファイルの内容を標準出力へ出力します.そして,catは引き数でファイルを指定しない場合,標準入力を読み込みます.

 すると,次のようにすると,標準入力を読み込んで,リダイレクションでjunkというファイルにテキストを書き込むようなことも可能になるわけです.

  $ cat >junk

  created by cat^D^D

 ここで,^Dはコントロールキーを押しながらDを入力することを意味します.^Dは端末からの今までの入力をすぐにプログラムに送ります(^D自身は送られない).1回目の^Dで“created by cat”という文字列がプログラムに渡り,2回目の^Dではタイプされた文字がないので入力がないと判断し,catは終了します.ちなみに,^Dは標準入力を終わらせるときによく使われます.

 UNIXのファイルは単純なバイトストリームです.作成したjunkの中身をodコマンドで見てみます.このコマンドは,ファイルの中身を8進表示でダンプします(図9)

(図9)odコマンドでファイルをダンプした結果
 $ od -bc junk

0000000 

143 162 145 141 164 145 144 040 142 171 040 143 141 164

 c    r     e    a    t    e    d    b     y    c    a    t

 なお,“-bc”オプションは,バイト単位と文字の二つの表示を行います.先ほどタイプした文字がそのまま過不足なくファイルに書き込まれていることがわかります.


注:3 POSIX:Portable Operating System Interface for Unix.APIの仕様.IEEEやISOで決められている.UNIXばかりでなく,ほかのOSにも実装されている.IEEE Std 1003.2はシェルおよびコマンドを規定したもので,ほかにはCのシステムコールを規定した1003.1などがある.


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

新刊のご案内


Copyright 1997-2001 CQ Publishing Co.,Ltd.