コマンドサーチパス
コマンドサーチパス
何かコマンドやアプリケーションを実行するときには、それに対応するファイルを、そのパスとともに指定する必要がある。たとえば、pwdというコマンドは/bin/pwd、wgetというコマンドは/usr/bin/wgetというファイルを指定して実行することになる。
しかし、我々がこれらのコマンドを実行するとき、/binや、/usr/binというディレクトリをわざわざ指定したりはしない。これは、これらのコマンドがパスの指定なしで打ち込まれたとき、コンピュータが、これらのコマンドに対応するファイルを、/binや/usr/binなどのディレクトリへ探しに行って見つけてくれるからである。このように、自動的に実行ファイルを探しに行くディレクトリ(のパス)を、コマンドサーチパスと言う。
コマンドサーチパスは、環境変数$PATHに設定される。/bin, /usr/bin, /usr/local/binなどは多くの場合、デフォルトで$PATHに設定されているが、それらに加えて、ユーザーが勝手にコマンドサーチパスを追加することもできる。
課題: 環境変数PATHの内容を表示し、現在のコマンドサーチパスがどのようになっているか調べよ (ヒント: $ echo $PATH)。
課題: ホームディレクトリの下にtmpというディレクトリを作り、その中に、dateコマンドを実行するシェルスクリプトを作成せよ:
$ mkdir ~/tmp $ cd ~/tmp $ vi date.sh date
$ chmod +x date.sh
この後、以下のように、ホームディレクトリに戻ってパスを指定してdate.shを実行してみよ:
$ cd $ ~/tmp/date.sh 2012年 5月 7日 月曜日 14:46:05 JST
ところがここで, パスの指定を省略すると, うまくいかなくなる:
$ date.sh date.sh: command not found
"command not found"とは, "date.shという名前の命令(コマンド)なんか知らないよ"という, 計算機の悲鳴(エラーメッセージ)である。実際, 環境変数PATHの中を見てみると...
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
のように表示される。このリストの中には, date.shというシェルスクリプト(コマンド)が入っている~/tmpというディレクトリが登録されていない。だから計算機は迷うのだ。そこで、以下の方法で、環境変数PATHに、~/tmpというディレクトリを追加してみよう:
$ export PATH=$PATH:~/tmp
すると、こんどはパスを指定しないでも、date.shというコマンドが実行できるはずである:
$ date.sh 2012年 5月 7日 月曜日 14:46:45 JST
再び, 環境変数PATHの中を見てみると...
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/sxxxxx/tmp
となる。末尾に現れた, /home/sxxxxx/tmpというのが, date.shを格納したディレクトリであり, 計算機は「コマンド探し」をするときにこのディレクトリもチェックするようになったから, うまくいくのである。
コマンドサーチパスにパスが登録されているディレクトリに格納されている実行可能ファイル(コマンド)は, 全て, パスを省略して実行することができる。そのようなコマンドについて, どこのディレクトリに格納されているかを逆に調べたいときがある。そのときにはwhichというコマンドを使う。例えば, lsというコマンドの本体(実行可能ファイル)がどこにあるかを調べるときは,
$ which ls /bin/ls
とすればよい。/binの中にlsがあることがわかる。
課題: 以下のコマンドが格納されているディレクトリを調べよ:
cp, wget, date.sh
注: Linuxでは標準でbashというシェルが使われているが、他のUNIXではtcshというシェルなどが使われることも多い。その場合、上のexportというコマンドではなく、setenvというコマンドを使う。
注: 上のようなやりかたでは、新たに追加したサーチパスは、今起動中のシェルでしか有効ではなく、再起動するともとに戻ってしまう。継続的にサーチパスを追加したい場合は、上の内容(exportのコマンド)を、~/.bashrcや~/.bashrcというファイルに記述しておけばよい。
→ Unix/Linux入門へ戻る。
Keyword(s):
References:[Unix/Linux入門]