btoメモ

なんか適当に書く

環境変数 PATH を自動で設定する方法

みなさんは UNIX系 OS で環境変数 PATH の設定をどうしてますか?

UNIX系 OS では微妙にディレクトリ構成が違ってたり、

同じ OS でも後から追加したパッケージの関係で PATH が違ってたりして面倒です。

僕の場合、環境変数 PATH は自動で設定するようにしているので、

ほとんど数年間シェルの設定は変わっていません。

すごく便利なので、僕が使ってる方法を紹介します。

まずは次のようなシェル関数を定義する。

function add_env(){

env_name=$1

shift

for i in $@; do

if ! dirs=`eval echo $i` > /dev/null 2>&1; then

continue

fi

for i in `eval echo $dirs`; do

if eval echo \$$env_name | egrep '(\:|^)'$i'(\:|$)' >/dev/null 2>&1; then

continue

fi

if [ -d $i ]; then

eval $env_name=\$$env_name:$i

fi

done

done

}

この関数は受け取った第2引数以降(複数可、メタキャラクタ指定可)を評価して、

ディレクトリだったら第1引数で指定した変数に追加するという処理を行います。

あとはこんな感じで環境変数に追加したい候補を列挙するだけ。

PATH=

add_env PATH "${HOME}/bin" "${HOME}/sbin"

add_env PATH "${HOME}/opt/*/bin" "${HOME}/opt/*/sbin"

add_env PATH "/usr/local/bin" "/usr/local/sbin"

add_env PATH "/usr/local/*/bin" "/usr/local/*/sbin"

add_env PATH "/opt/local/bin" "/opt/local/sbin"

add_env PATH "/opt/local/*/bin" "/opt/local/*/sbin"

add_env PATH "/opt/*/bin" "/opt/*/sbin"

add_env PATH "/usr/ucb"

add_env PATH "/bin" "/sbin"

add_env PATH "/usr/bin" "/usr/sbin" "/usr/*/bin" "/usr/*/sbin"

自動的に存在するディレクトリだけ $PATH に追加してくれるので、

いろんな環境で存在しそうなディレクトリを列挙しておけば、

自動的に必要なパスだけ残るようになっているわけです。

僕はこれですごくハッピーなのですが、

もし他に良い方法とかあったら、ぜひ教えてください!!