emacsでの$PATHでハマった話を書きます。
問題
emacsで、shell-commandを実行すると環境変数$PATHを見て、実行してくれます。しかし、
- [emacs][ruby] Emacs から rbenv で入れた ruby を呼び出せない - gan2 の Ruby 勉強日記
- emacsのPATHって・・・? - handlename's blog
でも触れられている通り、
- shell-commandを実行してecho $PATHするとき ・・・ (1)
- (getenv "PATH")するとき ・・・ (2)
で、$PATHの内容が違ってしまっていました。
僕の場合、(1)の値は、(2)の値の前に/usr/binや/usr/local/binがついたものであったため、perlbrewのpathをemacs上で設定してもshell-commandを実行するときはsystem perlを使ってしまうという状況でした。
色々調べてみたところ、Cocoa Emacs内のshellにおけるPATH設定 - むしゃくしゃしてやったが参考になりました。
上のようになった原因は、
- emacsでshell-commandを実行すると.zshenvが呼ばれる + /etc/zshenvが呼ばれる
ことでした。
/etc/zshenvでは、osxのpath_helperが実行されていたため、/usr/binなどがPATHに前置されて、上のような問題が起こっている感じでした。
解決策
結局path_helperによる管理をやめて、.zshenvで必要なPATHを使うようにしました。
sudo chmod -x /usr/libexec/path_helper
また.zshenvでちゃんとPATHを管理するように
export PATH=$PATH:/usr/local/share/python:$HOME/bin:/usr/local/bin:/usr/local/sbin:/opt/local/bin:/usr/bin:/usr/sbin:/opt/local/sbin:/bin:/sbin:$JRUBY_HOME/bin
これできちんと$PATHが設定できるようになりました。