「パスを通す」の意味とは?
パスを通すとは、具体的にはコマンドサーチパス(コマンド検索パス)を環境変数$PATH
に追加すること、と僕は理解しています。
パスを通すことによって、コマンド名のみでコマンドを実行できるようになります。
コマンド名のみでコマンドを実行するとは?
たとえば、/bin
ディレクトリのls
コマンドを実行するとき、本来はパス名/bin/ls
を使用する必要があります。
% /bin/ls
上記のようにパス名を使用してもコマンドを実行することはできますが、パスが通っていれば、下記のようにコマンド名のみでls
コマンドを実行することができるようになります。
% ls
コマンドサーチパスとは?
コマンドがパスの指定なしで実行されると、コンピュータはそのコマンドに対応するファイルを環境変数$PATH
に定義したディレクトリ内から検索します。コマンドサーチパスとは、つまり実行されたコマンドに対応するファイルを探しにいくディレクトリのパスのことで、環境変数$PATH
に定義されています。
環境変数$PATH
は、次のように確認することができます。
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
このように、コマンドサーチパスはコロン(:)
で区切られています。整理すると次のようになります。
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
これらのディレクトリに格納されているコマンドは、パスが通っているので、コマンド名のみで実行することができます。逆にいえば、ここにないディレクトリに格納されているコマンドは、PATHが通っていないので、パス名を指定しなければ実行することができない、ということになります。
ききほど実行したls
コマンドのコマンドサーチパスである/bin
も、環境変数$PATH
に定義されていることがここで確認できます。
パスを通す方法
パスを通すというのは、具体的には環境変数$PATH
を編集して、コマンドを格納するディレクトリを追記する処理を意味します。
環境変数を設定する際には、export
コマンドを実行するようです。下記のようにパスを通す方法がよく紹介されています。
% export PATH=$PATH:追記したいコマンドサーチパス
たとえば、/mybin
ディレクトリをコマンドサーチパスとして登録する場合を考えてみます。
まず、現在登録されているコマンドサーチパスを確認します。
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
ここに/mybin
を追加する場合は、次のようにコマンドを実行します。
% export PATH=$PATH:/mybin
export
コマンドは、環境変数を設定したりするためのコマンドです。
上記のコマンドは、環境変数$PATH
に[現在の$PATH
+ :/mybin
]を代入する、という処理をしているようです。
更新された環境変数$PATH
を確認するために、もう一度echo $PATH
を実行します。
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/mybin
このように、/mybin
というコマンドサーチパスが追加されることがわかります。
ちなみに、環境変数$PATH
をもとに戻すときには、次のようにコマンドを実行しました。
% export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
.bashrcと.bash_profileについて
パスを通すときは、~/.bashrc
や~/.bash_profile
にコマンドサーチパスを登録する処理を記述する方法が一般的なようです。
これらのファイルは、どちらも自動的に実行されるファイルで、下記のような違いがあるようです。
- .bash_profile: ログイン時のみ実行されるファイルで、環境変数の設定などに使用される
- .bashrc: 対話モードのbashを起動するときに実行されるファイルで、エイリアスやシェル関数の定義などに使用される
試しに.bash_profile
を使って/mybin
のパスを通してみようと思います。
まずは.bash_profile
ファイルをエディタで開きます。
% vi ~/.bash_profile
最終行にパスを通すための処理を追加します。
export PATH=$PATH:/mybin
最後に、source
コマンドを実行して、.bash_profile
ファイルの変更を反映させます。.bash_profile
はログイン時に実行されるファイルなので、ログインをやり直さずに変更内容を反映させたいときはsource
コマンドが使用されるようです。
% source ~/.bash_profile
環境変数$PATH
が上書きされたことを確認します。
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/mybin
これで、/mybin
ディレクトリのファイルはパス名のみで実行することができるようになりました。
コマンド検索の優先順位
環境変数$PATH
には、複数のコマンドサーチパスを登録することができます。
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
僕の環境では上記のように環境変数が定義されていますが、コマンドがパスの指定なしで実行されると、コンピュータは左から順番にコマンド検索を始めるようです。
つまり、次のような順番でコマンドを検索します。
- /usr/local/bin
- /usr/bin
- /bin
- /usr/sbin
- /sbin
たとえば、2番目の/usr/bin
と4番目の/usr/sbin
に同名のコマンド実行ファイルが存在した場合、実行されるのは/usr/bin
ディレクトリのコマンド実行ファイルになります。「コマンドは実行されるけれど、意図した挙動ではない」というような場合は、環境変数$PATH
の中身を確認するとよいかもしれません。
実行ファイルの格納場所を調べる
which
コマンドで、コマンドのパスが通っているかどうかを調べることができます。
% which git
/usr/local/bin/git
コマンドのパスを調べるときに使うコマンドには、which
の他にもwhereis
というものがあるようです。
- which: 環境変数
$PATH
で定義したコマンドサーチパスを検索する - whereis:
/usr/bin:/bin:/usr/sbin:/sbin
を検索する
上記のような違いがあるようなので、パスが通っているかどうかを知りたいときはwhich
コマンドを使ったほうがよさそうです。