UNIX入門:8. コマンドのパスと登録:~/bin と rehash

8.1. コマンドのパス

 コマンド command がサーバーに備わっているか否かは,次のようにして確認できます。

■コマンドの絶対パス

% which command

この例から分かるように,コマンドは,/usr/bin とか /bin 内にあります。実際,/bin 内の実行可能ファイルがシェル・コマンドです。

 これに対し,自らが使用可能なコマンドがどこのディレクトリなのか,調べることもできます。

■コマンドのパス一覧

% echo $PATH

これは,コロン : で区切って見ます。先ほどの ls の絶対パスが /usr/bin/ls でしたが,それは,ここでいうと3つ目の /usr/bin 内にあるコマンドです。

8.2. パス(PATH)の通し方

echo $PATH にないパス path にパスを通すには,次のファイルをホームディレクトリ ~/ 内に作成しておけば,次のログインからは path にパスが通ります。

・ログインシェルが tcsh の場合
:ファイル名 .tcshrc
setenv PATH ${PATH}:path

・ログインシェルが bash の場合:ファイル名 .profile
PATH=$PATH:path

[ノート]$SHELL$PATH$HOMESHELLPATHHOME を「環境変数」という。環境変数一覧の出し方は次の通り。

% printenv
HOME=/Users/taro   # ホームディレクトリ
SHELL=/bin/tcsh    # ログインシェル
USER=taro          # ユーザ名
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/Users/taro/bin   # パス
...

8.3. コマンドの登録

 7 で見たエイリアスは,コマンドの省略であり,コマンドが本来存在するディレクトリにある訳ではありません。サーバーによっては,再起動するとエイリアスが消えたりします。したがって,シェル・スクリプトや C,Perl などで作成したプログラムをコマンドとして登録したいものです。ところが,/usr/bin/bin は,root が所有者であり,サーバーを利用するすべての人が使用するコマンドが格納されています。そこで,必要となるのが,各ユーザが個別に設定するコマンドです。

 例8.3で自らのホーム・ディレクトリ内のディレクトリ ~/bin にパスを通しました。そこで,~/bin 内に収めた実行可能ファイルをコマンドとして登録してみましょう。

■コマンドの登録方法 (コマンドのパスが,~/bin に通っている場合)
 実行ファイル executable をコマンド command として登録

% cd
% cp executable bin/command
% chmod u+x bin/command
% rehash

上記のコマンドの中で,最後の rehash 以外は既出。3行目は,実行ファイル executable を自分のホーム内のディレクトリ bin にコピー。但し,コピーの名称は command。最後の rehash は,新しく作成したコマンドを認識させるためのものです。

[ノート] #!/bin/sh の意味
シェル・スクリプトの先頭には,「#!/bin/sh」を入れます。この一行をはずして,上記のようにコマンドとしてシェル・スクリプトを登録すると,どうなるのでしょうか?実は,動かないのです。その一行が,シェル(実行ファイル /bin/sh)での実行を知らせています。

 実行ファイルをコピーする上記の方法では,元の実行ファイルを編集すれば,再びコピーしないと,編集の効果はコマンドにいかされません。そこで,コピーではなく,シンボリック・リンクを使うと良いかもしれません。

■シンボリック・リンクでコマンドを登録

% cd
% ln -s executable bin/command
% chmod u+x executable
% rehash