$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

emacsにおける$PATHの話

emacsでの$PATHでハマった話を書きます。

問題

emacsで、shell-commandを実行すると環境変数$PATHを見て、実行してくれます。しかし、

でも触れられている通り、

  • 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が設定できるようになりました。