第3部ファイルシステムの第1.5節 で紹介したとおり, UNIX のコマンドはファイルとして存在しています。 コマンドの多くは, コマンドと同名の実行可能なアクセス権を持つファイルです。
さて,実行しようとするコマンド(ファイル)がどこにあるのかを調べるために, which というコマンドが利用できます。 which の引数にコマンド名を与えると,そのコマンドの所在が絶対パ ス名で表示されます。 ls, cal, emacs, kterm の各コマンドがどこにあるのかを調べるために
which ls cal emacs kterm
を実行してください。
コマンド行にコマンド名をタイプすると,シェルは実行すべきコマンド(ファイ ル)を特定のディレクトリから検索します。そのディレクトリは
echo $PATHを実行して調べることができますので試してください 6。
ディレクトリ /bin の中のコマンド ls のようにファイルとして存在しているコ マンドを実行するときには,本来,パス名(例えば ls の絶対パスであれば /bin/ls) を使う必要があります。しかし,それでは不便ですので, $PATH リスト 7 に含まれるディレクトリ内のコマンドについては,ファ イル名(コマンド名)のみで実行できるようになっているのです。逆に言えば,こ のリストに含まれるディレクトリ以外の場所に,ファイルとして存在するコマン ドを実行するには,パス名を用いなければいけません。
ここで $PATH のリストに . (ドット = カレントディレクトリ) が含まれてい ないことに注意しましょう。コマンド名でコマンドを実行しようとすると, その実体であるファイルはあくまで $PATH リスト内のディレクトリから検索さ れます。したがって,$PATH リストに . が含まれていなければ,カレントディ レクトリ内に存在するコマンドを,コマンド名のみで実行することはできません。 そのため,仮にカレントディレクトリ内にコマンド com が存在するとして,そ れを実行したければ,カレントディレクトリに存在するコマンドであることを明 示して ./com 等とする必要があるのです 8。
なお,コマンド名でコマンドを実行する場合,$PATH リストの始めの方から, コマンドが探索されます。したがって,同名のコマンドが $PATH リストの中の 複数のディレクトリに存在する場合,始めの方のディレクトリに存在するものが 実行されます。
コマンド which はどこにあるのでしょう -- which which を実行してください。 which: shell built-in command. (シェル組み込みコマン ド) と表示されますね。このように,コマンドと同名のファイルではなく,シェ ルが内部に持っているコマンドもあります。 例えば,ログアウトするために使っている exit というコマンドは,正確には現在使っているシェルを終了するためのシェ ル組み込みコマンドです。ログインシェルを終了すると計算機からログアウトす ることになるので9,exit で計算機の利用を終えることができるので す。
シェルの組み込みコマンドは,コマンド検索パスの設定にかかわらず,コマンド 名で実行できます。また,実行の優先順位はファイルのコマンドより高いです 10。
シェル組み込みコマンドのマニュアルは,シェルのマニュアルに記載されていま す11。
ディレクトリ /sbin には管理用コマンドが格納されています。一般ユーザー用 の標準設定では,/sbin は $PATH のリスト内にはありませんので,/sbin に存 在するコマンドをコマンド名だけで実行することはできません。しかし,$PATH のリストに /sbin を加えることによって,/sbin に存在するコマンドをコマンド 名のみで実行できるようになります。 そのためには,シェルとして csh や tcsh を使っている場合,
setenv PATH ${PATH}:/sbinを一度実行します。 これにより,例えば /sbin/mount を mount と打つだ けで実行できるようになります。
ただし,この設定はログアウトすると無効になりますので,ログインする度に行わなけ ればなりません。それをせずに済ますには,ホームディレクトリのファイル .cshrc の最後に上記の内容を書き込んでおきます。.cshrc に書いた内容 は,ログインする度に自動的に実行されます12。
なお,$PATH は環境変数と呼ばれるものの一つであり, setenv は環境変数を設定するためのシェル組み込みコマンドです。 setenv の一般的な書式は
setenv 環境変数名 値ですが,これ以上の説明は割愛します 13。