理系学生日記

おまえはいつまで学生気分なのか

Macを切り替えたら exec-path-from-shellで環境変数が引き継がれなくなる

ずっと MacBook Air で日常を暮らしてきて、やっぱりデカいディスプレイで暮らしたいなぁということで、昔つかってた iMac に乗り変えました。 そこで困ったのが、Emacs で環境変数が引き継がれてこないということでした。

Emacs では、exec-path-from-shell を使うことで、zsh に定義した環境変数を Emacs でも使えるようにしているんですが、PATH とか GOPATH とかが使用できなくなっている。なぜだ。

これ、原因は、デフォルトシェルを切り替えていないからでした。これで解決。

$ sudo echo '/usr/local/bin/zsh' >> /etc/shells
$ chsh -s /usr/local/bin/zsh
$ sudo shutdown -r now

内容

exec-path-from-shell は、環境変数の引き継ぎを「シェルを実際に Emacs 内部で実行し、printf 等を使用して環境変数の値を出力させ、それを読み取る」という形で実現しています。 そして、ここで実行されるシェルというのは、以下のように決定されます。

  1. exec-path-from-shell の exec-path-from-shell-shell-name で定義されたもの
  2. Emacs の shell-file-name で定義されたもの
  3. (Emacs から見える) SHELL 環境変数の値

具体的な関数はこちら。

(defun exec-path-from-shell--shell ()
  "Return the shell to use.
See documentation for `exec-path-from-shell-shell-name'."
  (or
   exec-path-from-shell-shell-name
   shell-file-name
   (getenv "SHELL")
   (error "SHELL environment variable is unset")))

Emacs の設定を色んな環境で使用しようと思うと、elisp の変数に対してパスを設定することは望ましくありませんから、ぼくはこのうちの 3. を使っていました。 結果として、デフォルトシェル(bash)の環境変数が使用されていたというお話。