A GNU Emacs library to ensure environment variables inside Emacs look the same as in the user's shell.
Ever find that a command works in your shell, but not in Emacs?
This happens a lot on OS X, where an Emacs instance launched as a GUI app inherits a default minimal set of environment variables that are probably not the ones you see in a terminal window.
This library solves this problem by copying important environment variables from the user's shell: it works by asking your shell to print out the variables of interest, then copying them into the Emacs environment.
If the path printed by evaluating
(getenv "SHELL") in Emacs points at
zsh, this should work fine.
At a minimum, this package assumes that your shell is at least UNIX-y: if
(getenv "SHELL") evaluates to something like
package probably isn't for you.
Further, if you use a non-POSIX-standard shell such as
shell will be asked to execute
sh as a subshell in order to print
out the variables in a format which can be reliably parsed.
be a POSIX-compliant shell in this case.
Note that shell variables which have not been exported as environment variables (e.g. using the "export" keyword) may not be visible to `exec-path-from-shell'.
Installable packages are available via MELPA: do
M-x package-install RET exec-path-from-shell RET.
the latest release or clone the repository, and install
Add the following to your
init.el (after calling
(when (memq window-system '(mac ns x)) (exec-path-from-shell-initialize))
exec-path from your shell, but only
when executed in a GUI frame on OS X and Linux.
You can copy values of other environment variables by customizing
exec-path-from-shell-variables before invoking
exec-path-from-shell-initialize, or by calling
This function may also be called interactively.
Setting up your shell startup files correctly
Note that your shell will inherit Emacs's environment variables when
it is run by
exec-path-from-shell -- to avoid surprises your config
files should therefore set the environment variables to their exact
desired final values, i.e. don't do this:
but instead do this:
You should also set your environment variables so that they are
available to both interactive and non-interactive shells. In practical
terms, for most people this means setting them in
~/.zshenv instead of
~/.zshrc. By default,
exec-path-from-shell checks for this
mistake, at the cost of some execution time. If your config files are
set up properly, you can set
appropriately (often to
nil) before calling
exec-path-from-shell-initialize to avoid this overhead.
To learn more about how popular shells load start-up files, read this helpful article.
- Invoking the shell has a non-trivial overhead. Don't call
exec-path-from-shell-copy-envrepeatedly, since each invocation starts a shell. Instead, set
exec-path-from-shell-variablesto the full list of vars you want, and call
- Non-interactive shells start up faster. Follow the steps in the section above so that you can run your shell without
-iand still get the right environment variable settings. When
"-i"is then removed from
exec-path-from-shell-arguments, this package becomes more efficient.
C-h f exec-path-from-shell-initialize
C-h f exec-path-from-shell-copy-env