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にある。
これはbashと csh の 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が最初に来なくなる。