unix 系 OS では ${PATH}
環境変数を参照してコマンドの検索パスを指定する事ができます。
通常はログイン時にシステムデフォルトのコマンド検索パスが ${PATH}
に自動で設定されていますが、ユーザ毎のシェルのログインファイル (${HOME}/.profile
等)で自分用のコマンド検索パスを追加設定する事が多いと思います。
ここで気をつけるべきは ${PATH}
中のヌルパス (::
) はカレントディレクトリ (.
) と同等に扱われてしまう事です。
例えば
PATH="${PATH}:${mypath}:${HOME}/bin"
と設定した時に ${mypath}
が設定されていない場合は
PATH="${PATH}::${HOME}/bin"
と展開されてしまうので、結果としてカレントディレクトリが ${PATH} に含まれてしまいます。
この挙動は POSIX (IEEE Std 1003.1, 2004 Edition) の8.3 Other Environment Variables) にも明記されていて、
The prefixes shall be separated by a colon ( ':' ). When a non-zero-length prefix is applied to this filename, a slash shall be inserted between the prefix and the filename.
A zero-length prefix is a legacy feature that indicates the current working directory.
過去互換性の様なのですが非常に迷惑な仕様でもあります。
カレントディレクトリをコマンド検索パスに含める事は セキュリティ上のリスクを伴うのでどんな場合でも避けるべき ですので、PATH を設定する場合は注意が必要です。
例えば ${HOME}/.profile
で ${PATH}
を設定する場合に、 sed (1) を利用して以下の様にする事は防衛手段として悪く無い考えだと思います。
PATH="`echo ${PATH}:${mypath}:${HOME}/bin | sed 's/::*/:/g'`"
セキュリティの問題は自分だけではなく、同じサーバを利用している多くの利用者や、場合によってはインターネット全体など非常に広範囲にわたって影響を及ぼす可能性がある危険な問題ですので、注意を怠らない様にする事が重要だと思います。