環境変数PATHについて
$ export PATH=:
を実行した後、何かコマンドを入力してみると、エラーになる。*1
$ ls bash: ls: command not found
しかし、その状態で、コマンドの実行ファイルの場所を/からたどって書く(絶対パス/フルパス)か、現在の階層からの相対的な場所(相対パス)を指定して実行すると、いつもlsコマンドを実行しているように、実行ができる。
$ /bin/ls --color=auto (結果が出力される) $ cd; ../../bin/ls --color=auto (結果が出力される)
普段、コマンド「名」だけでその実行ファイルを実行させられているのは、PATHという環境変数に、実行ファイルの存在するディレクトリが含まれているからで、逆に、PATHに無いディレクトリに実行ファイルがあっても、コマンド名のみで実行させることはできない。
現在のPATHを確認
$ echo ${PATH}
で、「:」区切りのPATHが表示される。内部的にもこの形式で扱われる。
$ echo -e "${PATH//:/\n}"
を実行すると、「:」が改行文字に変換され、縦に並んで表示される。
PATHの優先順位
「:」で区切られている複数のディレクトリの中で、一番左が最も優先度が高く、一番右が最も低い。例として、PATHの値が
/usr/local/bin:/usr/bin:/bin
となっていて、/usr/local/bin/timidityと/usr/bin/timidityが存在する場合、
$ timidity
と実行すると、/usr/local/bin/timidityが実行される。
PATHを設定(パスを通す)
「パスを通す」というのは、コマンド名のみでその実行ファイルを実行できるようにするため、PATHの中に、実行ファイルのあるディレクトリを追加することを意味する。
PATHを新しく追加したい場合、シェルの初期化ファイル(bashなら${HOME}/.bashrc)で設定するとよい。その際、既に設定されているPATHの値を上書きしないよう、先頭か末尾に「${PATH}」を含める。どちらにするかは、優先順位によって決める。
export PATH=${PATH}:~/bin export PATH=~/bin:${PATH}
下の書き方は、システムにインストールされているコマンドを独自のものに置き換えたり、コマンドに対して環境変数をセットしつつ起動する、下のようなスクリプトを作成して使用するということもできる。
#! /bin/sh LC_TIME=C /usr/bin/gkrellm "$@"
このようなスクリプトを作成する際は、必ず実行ファイルの場所をフルパスで書くこと。もし、これを
#! /bin/sh LC_TIME=C gkrellm "$@"
と書いて実行した場合、これを止めない限り、スクリプト自身を永久に呼び出し続け、大変なことになる(スクリプトの中で呼ばれるのは、PATHの中で最初に見つかる「自分自身」となるため)。
また、${HOME}/binが優先されるようにすると、悪意のあるコマンドを、ユーザ権限で書き込める場所に配置できることにもなるため、先頭に「${PATH}」を書くほうが、その意味でも無難かもしれない。
*1:echoなど、シェルの組み込みコマンドは実行できる