OSX上的Emacs和命令行$ PATH不一致


18

PATHEmacs 上的设置存在一些影响我Haskell环境的问题:

我正在使用ZSH,当我转到命令行并调用时echo $PATH,它将返回:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

这来自.zprofile我有的配置:

# Set the list of directories that Zsh searches for programs.
path=(
  ~/Library/Haskell/bin
  /usr/local/{bin,sbin}
  $path
)

因此,从命令行,当我调用时which cabal,我正确地得到了:/Users/g/Library/Haskell/bin/cabal

当我启动Emacs并转到shell和调用时which cabal,我得到:/usr/bin/cabal这是我的问题,因为它是另一个版本。

echo $PATH从Emacs进行检查时shell,我看到:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

我不知道到底PATH会有什么不同...

有谁知道如何让我的ZSHshell和Emacs达成一致PATH?我怀疑那是控制cabal从何处加载的内容。

更新echo $SHELL从Emacs 运行打印:/bin/zsh

更新2:这是在OSX上

更新3:我试图使用exec-path-from-shell模块,它不起作用。我仍然有相同的问题,而且副作用是,它弄乱了我的终端主题颜色:(

更新4:我已经通过安装了Emacs,brew install --cocoa --srgb emacs并且运行了以这种方式链接的emacs:

~ ❯❯❯ which emacs
/usr/local/bin/emacs
~ ❯❯❯ l /usr/local/bin/emacs
lrwxr-xr-x  1 g  admin    30B 29 Jan 18:34 /usr/local/bin/emacs -> ../Cellar/emacs/24.4/bin/emacs
~ ❯❯❯ l /usr/local/Cellar/emacs/24.4/bin/emacs
-r-xr-xr-x  1 g  admin    87B 29 Jan 18:34 /usr/local/Cellar/emacs/24.4/bin/emacs

您是否正在使用ZSH作为登录外壳?
wasamasa

不知道您确切说登录shell是什么意思,但是我想我chsh...那天回叫过更改默认的shell
GalderZamarreño2015年

我正在使用iTerm2 btw ...
GalderZamarreño2015年

2
显然不是,请在~/.profile/etc/profile之后修改PATH 。
wasamasa

1
在中设置您的环境变量~/.zshenv,无论启动外壳程序(交互式还是非交互式),该变量都将始终源于环境变量。如果exec-path-from-shell弄乱了终端主题颜色,则可以在调用前将其设置exec-path-from-shell-arguments为确保其未运行zsh配置的交互式部分。nilexec-path-from-shell-initialize
sanityinc

Answers:



8

这是一个OSX烦人的环境问题,$PATHEmacs中出现的问题来自/etc/paths文件,然后将其附加到我在shell中设置的内容之后。我添加/Users/g/Library/Haskell/bin/etc/paths文件的顶部,然后工作正常。

echo $PATH现在进入shell并调用Emacs会显示:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

cabal的版本确实是cabal-install version 1.22.2.0:D

谢谢大家!


感谢beOn $PATH在OSX 帖子中的提示。
GalderZamarreño2015年

2
更好的解决方案是修改中的路径~/.zshenv。Emacs的路径反映了那里的变化
GalderZamarreño2015年

我可以确认,仅仅是这样做echo export PATH=$PATH > ~/.zshenv使Emacs M-x shell可以在下一次调用时选择它。
Linus Arver'8

5

如果从GUI环境(gnome,kde等)启动emacs,则外壳启动脚本将不会源于您的环境。因此$PATH,您精心设置的.zsh不会被加载。GUI环境通常不提供这些资源,尽管它们可能会加载您的~/.profile文件。

您可以尝试将其添加到您的.pam_environment

PATH DEFAULT=${PATH}:/MYHOMEDIR/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin

您将需要重新启动GUI会话以加载它。

该文档可以帮助您$PATH正确设置变量:

https://help.ubuntu.com/community/EnvironmentVariables#Session-wide_environment_variables

我使用该~/.pam_environment文件管理需要从Shell或emacs进程访问的环境变量。

PS:一位敏锐的评论员指出您可能在Mac上。我不知道如何$PATH在Mac GUI中进行设置,但重点仍然是外壳环境与GUI环境之间的差异。设置$PATHGUI的方式似乎取决于操作系统版本。但是,您可以使用:

(setenv "PATH" (concat (getenv "PATH") ":/foo/bar"))

在你的~/.emacs.d/init,如果你只是想,应该工作的解决方案。

PPS:如果要在emacs中运行shell,最好使用ansi-term而不是shell


考虑到发问者提到了iTerm 2的使用,我怀疑问题是关于Linux的。
wasamasa

3

如果PATH的某些部分丢失,则可以将其添加到〜/ .emacs中

;;; We add /path/to/something/extra by appending it to the path
(setenv "PATH" (concat (getenv "PATH") ":/path/to/something/extra"))
;;; /path/to/something/extra is now at the end of the PATH.
;;; or you can use:
;(setenv "PATH" (concat "/path/to/something/extra:" (getenv "PATH")))
;;; /path/to/something/extra is now at the beginning of the PATH.

为了避免PATH问题,我总是从〜/ .bashrc导出的PATH从命令行启动emacs。


2

完成此操作的另一种方法是简单地告诉Shell这是一个登录Shell,以便它获取所有正确的文件。我通过设置为bash来进行此explicit-bash-args操作("--noediting" "--login")。看起来zsh的等效项将设置explicit-zsh-args("-l")

所以在我的.emacs

(setq explicit-bash-args '("--noediting" "--login"))

在您的计算机中,类似:

(setq explicit-zsh-args '("-l"))

我认为这"--noediting"是不必要的,并且似乎没有办法告诉zsh这件事,但是如果这不能按您希望的那样进行,那可能是要研究的东西。


1
这适用于在Emacs下运行的shell。它不适用于直接在Emacs中运行的命令,例如via M-x shell-command
蒙斯特

1

您还可以设置OS X范围内的默认路径,例如,将以下属性列表保存为~/Library/LaunchAgents/my.startup.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

注销并重新登录后,新路径应显示在Shell,Emacs和其他应用程序中。

此方法不会更改作为登录项打开的应用程序中的路径,也不会更改强制关闭后在登录时重新打开应用程序的路径。如果您有Emacs,终端应用程序或其他要更改登录项路径的应用程序,则必须将其删除。

在10.9和更早的版本中,您还可以将以下行添加到/etc/launchd.conf

setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

但是,/etc/launchd.conf在10.10中删除了对它的支持。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.