試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

環境変数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など、シェルの組み込みコマンドは実行できる