当不从终端启动时,Emacs 不会获取 SSH_AUTH_SOCK 环境变量

当不从终端启动时,Emacs 不会获取 SSH_AUTH_SOCK 环境变量

当我不从终端启动它时,Emacs 24.5.1(从源代码编译)不会获取我的环境变量。特别是,要从 shell 中“导入”环境变量,我在我的.emacs

(setq exec-path-from-shell-variables
      (quote ("PATH" "MANPATH" "INFOPATH" "C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"
              "LIBRARY_PATH" "LD_LIBRARY_PATH" "SSH_AUTH_SOCK")))
(exec-path-from-shell-initialize)

并提供我解锁的私钥以ssh使用 GNOME Keyring 的“ ssh-agent”(又名gnome-keyring-daemon)我的.bashrc(我的用户 shell 是bash

if [ -n "$DESKTOP_SESSION" ];then
    eval $(gnome-keyring-daemon --start --components=ssh)
    export SSH_AUTH_SOCK
fi

但是在 Magit 中执行任何与远程相关的任务(例如,pushpull)时,我收到错误

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

*magit-process*缓冲区中,这意味着 Emacs 没有看到我解锁的私钥,因此 Emacs 没有使用 提供的套接字SSH_AUTH_SOCK,因为相同的远程相关git命令在终端中运行没有任何问题。

我已经签入eshell并且SSH_AUTH_SOCK在 Emacs 中具有与在外部终端中具有相同的值bash。另外,当我从终端(X 或 TTY 中)启动 Emacs 时,所有环境变量都会被选取,并且没有问题。我知道当在终端中运行时,Emacs 会从 shell 继承环境变量。我的问题是exec-path-from-shell-variables,当我不从终端启动 Emacs 时,为什么我的环境变量(显然是由 正确“导入”到 Emacs 中)不被 Emacs 使用?同样的设置已经在我的另一台装有 Emacs 24.3 的机器上运行了好几年,但我怀疑罪魁祸首可能是较新的 Emacs 版本。

编辑:我的操作系统是 Trisquel 7.0,它基于 Ubuntu 14.04 GNU/Linux。我通常使用 LXDE,但其他桌面环境也存在这个问题。在终端外,我通过按Alt+F2(运行) 并输入 来启动 Emacs emacs。在终端中,我通过输入 来启动 Emacs emacs。我的环境变量设置在~/.bashrc.我知道登录和非登录 shell(交互式或非交互式)的复杂性,并且我已经检查过我的 shell 是否~/.bashrc正在运行,无论我如何登录(例如,在 X 中登录到桌面环境或窗口管理器,在 TTY 中,或通过ssh)。

答案1

我的环境变量设置在~/.bashrc.

这就是你的问题。然后,您的环境变量仅在从终端启动的应用程序中设置,而不会在从 GUI 菜单启动的应用程序中设置。

我知道登录和非登录 shell(交互式或非交互式)的复杂性,并且我已经检查过我的 shell 是否~/.bashrc正在运行,无论我如何登录(例如,在 X 中登录到桌面环境或窗口管理器,在 TTY 中,或通过 ssh)。

显然你是不是了解登录和非登录 shell 的复杂性。当您登录时,您的.bashrc程序根本不会运行。它会在您启动交互式 shell 时运行。

解决方案是将变量设置在应该设置的位置,即在~/.pam_environmentor ~/.profile(由某些显示管理器(例如 GDM)调用的会话读取)或~/.xsessionrc(由某些显示管理器(例如 Lightdm)调用的会话读取)。

.bashrc 的替代方案,正确设置环境,设置环境变量的最佳发行版/与 shell 无关的方法是什么?,如何设置 PATH 或其他环境变量以便 X 应用程序可以访问它?,登录 Shell 和非登录 Shell 之间的区别?还有很多。

相关内容