from 2015-6-7

自分用の備忘録としてネット上にも残しておこうと思い書いています

pathで最初に入ってしまう初期値(/usr/local/bin等)の読み込みの順を後の方にする。

問題:/usr/local/Cellarのなかのディレクトリにpathを貼りたかった。

homebrewで入れたpythonもopensslもこの中にあるから。

だけど、~/.bash_profileをいくらいじっても/user/local/binの中に入った

古いpython, opensslなどを読み込んでしまう。(これはwhich opensslとか

where opensslで確かめることができた。)

どうしてだろう?と問うと、答えは、/usr/local/binのpathが/usr/local/Cellar

のpathよりも先に読み込まれるからだ。

 

じゃあどうにかして、読み込むpathの順を変えなくてはいけないのだが、

macだと厄介だ。いろいろ.bash_profileを書き換えてもうまくいきそうにない。

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

が.bash_profileに書いたものよりも先に読み込まれてしまうからだ。

 

これが起こる仕組みはこうだ。.bash_profile以前に初期ファイルとして
/etc/profileがコールされる。そこには

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi
if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi
と書かかれている。このうちの前半部分に注目する。

そこではpath_helperを呼び出している。

(ためしに/usr/libexec/path_helperと打つとPATH="/usr/local/bin:/usr/bin:
/bin:/usr/sbin:/sbin:/opt/X11/bin:
/Library/TeX/texbin"; export PATH;
と出てくる。)

path_helperというツールはmac特有のものだ。

path_helperの解説は
http://www.softec.lu/site/DevelopersCorner/MasteringThePathHelper

にある。そこに書いていることは次の通り。

path_helperは/usr/libexecにある。
これはbashcsh の PATH 環境変数と MANPATH 環境変数を作り出すためのものだ。/etcにあるファイルを使ってそれらを作り出すのだ。

path_helperの手順はこうだ

1. 初期値を /etc/paths と/etc/manpathsから読み込み、

そのあと  /etc/paths.d と /etc/manpaths.dに書かれているものを読み込む。
そしてその内容を前者のPATH環境変数とMANPATH環境変数にそれぞれ付け加える。(一行につき一つのpathが書かれている必要がある)

/etc/pathsに書かれている初期値は
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
だ。
実はこの初期値を実は読み込むわけじゃない。だからこのpathの順序を変えても

pathの順序は変わらない。

 

2. 確かにpathに新しい値を付け加えるには/etc/paths.d に新しいファイルを作り、おけばいい。(1つのパスにつき、1行をつかって)

3. だが /etc/pathsのパスの順を変えたければpathsに書いているpathの順序を

変えることだと思うかもしれないけどそうしてもpathの読み込み順は変わらない。

4. じゃあどうするか?
    /etc/csh.login
    /etc/profile
    /etc/zprofile or /etc/zshenv depending on your MacOS version
に注目する。そしてpath_helperへのコールの前に/etc/profileの中にPATH=""を加える。
そして/etc/profileが
if [ -x /usr/libexec/path_helper ]; then
    PATH=""
    eval `/usr/libexec/path_helper -s`
fi
のようにする。
そうすることで、

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

が最初に読み込まないようにできる。

 

path_helperが/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinの初期値をつけてしまうので

それをつけないようにするためには、/etc/profileを書き換えることが必要で

PATH=を上に書いているように付け加えればいい。これで/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinが最初に来なくなる。