$PATH ってなんか面倒
環境変数のPATHってどうしても、適当にしてると面倒なことになりがち。私の場合、rbenv のshims が遅いから、直接叩いてたり、node系のコマンド が幾つも入ってたり、、、
PATH をシンプルにするヒューリスティック解釈
完全な経験則ですが
$PATH に入れる文字列は、 絶対パスが長い方が優先度が高い。
絶対パスで長い文字列のほうが大事なことが多いです。
Windowsの場合は、C:\program files を使うので、フルパスじゃなく%Programfiles%を使うと、この経験則でいけそう。
経験則でPATHを整頓する
この「文字列の長さ」に着目して、PATHをソートするとこんな感じになる。
function sort_path_env { path=$* path=${path//:/ } path=$(for i in $path; do echo $i; done | awk '{print length() ,$0}' | sort -nr | awk '{print $2}' |uniq| tr '\n' ':') echo $path return 0 } export PATH=$(sort_path_env $PATH)
ついでに、uniq して適当にPathを追加してもおかしくならないようにしてる。
やってみた結果
takuya@~/Desktop$ echo $PATH | ruby -pne '$_.gsub!(/:/, "\n")' /Users/takuya/bin /usr/local/sbin /usr/local/bin /opt/X11/bin /usr/sbin /usr/bin /sbin /bin
美しい。
以前は、ソートをrubyでやってんだけど、rubyがrbenvのshims経由になるのでどうしても遅かった。なのでawk/sort/uniq で作り直したものになる。
ruby(rbenv) 遅かった。bash起動遅かった・・・
その他の解決策もあるんだけど
- hash して優先度を変えておく
- alias してしまう。
- function してしまう。
hash も alias も function もあとでアレどこだっけと、自分の設定で自分ではまり込んだのでした。
2016-03-14 追加
このやり方だと、CygwinのPathがおかしくなった。Windowsの空白パス名にやられた。
path=$( echo $PATH | sed 's/:/\n/g' | while read f ; do echo ${#f} $f ;done | sort -n |uniq | cut -d ' ' -f 2- | tr '\n' ':' )
空白パス名をきっちりloopさせるやり方を無理やりねじ込んだ。