最近のMac OSXで、PATHをスマート(?)に管理するやり方。
MacPorts用の/opt/local/binなどを全ユーザのPATHに設定したくて、やり方を調べました。
~/.profile(zshなら~/.zprofile)に設定してもいいのですが、これだとユーザごとに設定しなければなりません。できれば全てのユーザに対して、デフォルトで/opt/local/binを優先したいところです。
path_helperを使う。
以下のファイルを見ると、
- /etc/profile
- /etc/zprofile
- /etc/csh.login
全部が/usr/libexec/path_helperを読み込んでいます。path_helperの冒頭のコメントを見てみます。
/usr/libexec/path_helper
#!/bin/sh # # Each line of the text files in /etc/paths are directories that should be # added to the current path. We source /etc/paths/default first, so that # the default paths (/usr/bin:/bin:/usr/sbin:/sbin) appear early in the path. # :
なんかちょっといい加減なコメントですが、ソースを読むと、/etc/pathsを書き換えるか/etc/paths.dにファイルを置くことでPATHを設定することができるようです。/etc/pathsファイルに優先度の高いパスを書き、/etc/paths.dディレクトリ以下に優先度の低いパスが書かれたファイルを置きます。path.d以下のファイルはアルファベット順に読み込まれます。
これはLeopardから追加されたパスの管理方法みたいです。
試しに/etc/pathsにパスを追加してみます。
/etc/paths
/opt/local/bin /opt/local/sbin /usr/bin /bin /usr/sbin /sbin /usr/local/bin
冒頭の2行が追加したパスです。
(2010-11-29 追記) ここから下の修正はSnow Leopardでは必要ありません。デフォルトで正しく動作するように修正されていました。Snow Leopardからpath_helperはバイナリになりました。man path_helper参照。
* Snow Leopard時代のパス管理術 - builder
* Source Browser path_helperのソース
以下、Leopardのみ対象。
ちゃんと設定できたかな?ターミナルを開いて確認すると、
$ echo $PATH /usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/X11/bin
なぜか/opt/local/binが/usr/binの後に設定されてしまいました。もう一度ソースを読みます。どうやらpath_helperの実行前に元から設定されていたPATHが一番最初に来るようです。
path_helperにあわせてprofileを調整。
/etc/pathsファイルに/usr/binや/binが書かれているのに、元のPATHを優先する必要はない気がします。そこで、/etc/profileでPATHをクリアしてみました。
if [ -x /usr/libexec/path_helper ]; then PATH="" eval `/usr/libexec/path_helper -s` fi
これでもう一度ログインしてみると、
$ echo $PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
うまくいきました!同様に/etc/zprofile, /etc/csh.loginにも設定します。csh.login には setenv PATH "" とします。chshでbash,csh,zshにログインシェルを変更してログインし、echo $PATHが正しく設定されていることを確認します。
元のPATHを消しちゃうのはちょっと心配な気もしますが、これよりも前にPATHを追加することってなさそうなので、たぶん大丈夫でしょう。
以下も参考まで。同じことをやってる方がいました。