それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PATHを整理整頓して順序を揃えてみたはなし(awkで書き直し)

$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させるやり方を無理やりねじ込んだ。

関連

標準入力行を文字長さ順にソートする - それマグで!

bash(csh)のhashとか言う、気づかないけど便利な機能 - それマグで!

環境変数PATHの順番を整理して、衝突を避ける - それマグで!