如何让Emacs识别bash环境变量进行编译?

Eps*_*tor 18 emacs compilation

我试图通过Emacs的编译模式编译u-boot,看起来Emacs不知道如何找到bash环境变量.即使我设置了它们,并且可以通过Emacs shell仿真进行编译,编译模式仍然会尝试编译,就好像它们不存在一样.

我需要做些什么来使其更具环保意识?

Boz*_*sov 29

您可以尝试添加以下内容.emacs:

(let ((path (shell-command-to-string ". ~/.bashrc; echo -n $PATH")))
  (setenv "PATH" path)
  (setq exec-path 
        (append
         (split-string-and-unquote path ":")
         exec-path)))
Run Code Online (Sandbox Code Playgroud)

取决于您是否设置了env变量,.bash_profile或者.bashrc您可能需要稍微调整此代码段.该示例适用于PATH变量,它更加特殊(因为您还必须exec-path在Emacs中设置),但可以扩展为适用于任意变量 - 您可以拥有必须从中读取.bashrc和设置的变量列表进入Emacs.

我不确定你是使用OS X还是GNU/Linux.从Linux的GUI菜单栏启动Emacs通常会导致Emacs PATH与从命令行启动的Emacs不同.这个问题可以追溯到第一个xdmXsession脚本,虽然它们很容易修复(基本上使用的Xsessionwrapper脚本exec $SHELL -c Xsession可以在运行用户的Xsession之前运行shell),没有人在很长一段时间内都这么做(和我怀疑有谁会).据我所知,问题甚至存在于现代的xdm后代,如kdmgdm.

在OS X上,env变量的处理完全是另一个问题,要获得ENV变量,通常必须从命令行运行Emacs /Applications/Emacs.app/Contents/MacOS/Emacs或者使用~/.MacOSX/environment.plist.我提供的代码片段应该涵盖两种情况.

更新

最近,exec-path-from-shell扩展使这个过程变得更容易.它$PATH以大致相同的方式设置emacs ,但使用扩展通常比自己破解解决方案更可取.


dmv*_*nna 7

这是启动进程的环境变量的emacs位置:

— 命令:getenv var

此函数以字符串形式返回环境变量 var 的值。var 应该是一个字符串。如果环境中的 var 未定义,则 getenv 返回 nil。如果设置了 var 但为 null,则返回 '""'。在 Emacs 中,环境变量及其值的列表保存在变量 process-environment 中。

      (getenv "USER")
           ? "lewis"
Run Code Online (Sandbox Code Playgroud)

— 变量:过程环境

这个变量是一个字符串列表,每个字符串描述一个环境变量。函数 getenv 和 setenv 通过这个变量工作。

      process-environment
      ? ("PATH=/usr/local/bin:/usr/bin:/bin"
          "USER=lewis"
          "TERM=xterm"
          "SHELL=/bin/bash"
          "HOME=/home/lewis"
          ...)
Run Code Online (Sandbox Code Playgroud)

您似乎假设 emacs 是从bash会话启动的。但是,通常 X 下的进程是从sh会话启动的,它不会读取您在~/.bashrc脚本中设置的环境变量。规避此问题的一种简单方法是更改​​您的~/.xinitrc文件以使用bash而不是sh(它可以像#!/bin/bash在文件顶部添加一样简单)。

来源:gnu.org