2013/07/09

PATH の扱い

unix 系 OS では ${PATH} 環境変数を参照して コマンドの検索パスを指定する事ができる。
通常はログイン時にシステムデフォルトのコマンド検索パスが ${PATH} に自動で設定されているが、 ユーザ毎のシェルのログインファイル (.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 を設定する場合は注意が必要だ。

例えば .profile${PATH} を設定する場合、 以下の様にする事は防衛手段として悪く無い考えだと思う。


PATH="`echo ${PATH}:${mypath}:${HOME}/bin | sed 's/::*/:/g'`"

    


Copyright © 2008-2020 Mitzyuki IMAIZUMI. All rights reserved.