shell-command の環境変数は Emacs から制御できない。

環境変数関係で、ちょっとはまったのでメモ。
Emacsには、exec-path という変数があって、環境変数PATHみたいな役割をしており、Emacsから call-process とかでコマンドを実行するときは、この中のパスから検索する仕組みとなっている。
shell-command の方は、こちらはコマンドがシェルに直接渡されるため、自分のデフォルトのシェルの環境変数を見るようになっている。即ち、exec-path は関係ない。
で、問題は、このシェルの環境変数について。
zsh を利用している場合、.zshenv は読んでくれるが .zshrc は読まない。
なんとなく聞いたことがあったけど、普段弄らないからほぼ忘れており、なぜか、perlbrew の環境変数だけ shell-command に反映されなくて困っていたら、source $HOME/perl5/perlbrew/etc/bashrc という設定だけ、なぜか .zshrc に書かれていて、shell-command で読み込まれずに、悶々としていた。
ポイントを纏めると、

  • call-process は exec-path を使う。
  • shell-command は exec-path を見ない。
  • shell-command は .zshenv を読む(zsh の場合)。
  • shell-command は .zshrc は読まない(zsh の場合)。
  • setenv で PATH を追加しても shell-command には関係ない。

という感じ。基本、うまく動いているときは、一切いじることもないし、気にも止めない設定だけに、嵌ると結構原因が分からず難儀しました。