我正在尝试通过Emacs的编译模式编译u-boot,看起来Emacs看起来不知道如何查找bash环境变量。即使我设置了它们,并且可以通过Emacs shell仿真进行编译,编译模式仍然会尝试编译,就好像它们不存在一样。
我需要做些什么来使其更具环保意识?
答案 0 :(得分:28)
您可以尝试添加与.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)))
根据您是否在.bash_profile
或.bashrc
中设置了env变量,您可能需要稍微调整此代码段。该示例适用于PATH
变量,这有点特别(因为您还必须在Emacs中设置exec-path
),但可以扩展为适用于任意变量 - 您可以拥有一个列表必须从.bashrc
读取并设置为Emacs的变量。
我不确定您是使用OS X还是GNU / Linux。从Linux的GUI菜单栏启动Emacs通常会导致Emacs与命令行启动的Emacs不同PATH
。这个问题可以追溯到第一个xdm
Xsession脚本,虽然它们很容易修复(基本上使用Xsessionwrapper
脚本执行exec $SHELL -c Xsession
所以shell在运行用户的Xsession之前运行),没有人在很长一段时间内这么做(我怀疑有人会这样做)。据我所知,问题甚至存在于现代xdm后代中,例如kdm
和gdm
。
在OS X上,env变量的处理完全是另一个问题,要获得ENV变量,通常必须从命令行运行Emacs,如/Applications/Emacs.app/Contents/MacOS/Emacs
或使用~/.MacOSX/environment.plist
。我提供的代码片段应该涵盖两种情况。
<强>更新强>
最近exec-path-from-shell扩展程序使这一过程变得更加容易。它以大致相同的方式设置emacs $PATH
,但使用扩展名通常比自己破解解决方案更好。
答案 1 :(得分:4)
这是启动emacs
的进程的环境变量:
- 命令: getenv var
此函数返回的值 环境变量var,作为字符串。 var应该是一个字符串。如果var 在环境中未定义,getenv返回nil。它返回'“”' 如果设置了var但是为null。在Emacs中,一个环境变量列表 并且它们的值保存在变量过程环境中。
(getenv "USER") ⇒ "lewis"
- 变量:流程环境
这个变量是一个字符串列表, 每个描述一个环境变量。功能getenv和 setenv通过这个变量工作。
process-environment ⇒ ("PATH=/usr/local/bin:/usr/bin:/bin" "USER=lewis" "TERM=xterm" "SHELL=/bin/bash" "HOME=/home/lewis" ...)
您似乎假设emacs是从 bash 会话启动的。但是,X下的流程通常是从 sh 会话开始的,这会不读取您在~/.bashrc
脚本中设置的环境变量。避免这种情况的一种简单方法是将~/.xinitrc
文件更改为使用 bash 而不是 sh (这可能就像添加#!/bin/bash
一样简单文件的顶部)。
来源:gnu.org
答案 2 :(得分:3)
它没有严格回答您的问题,但您始终可以在make
命令行上传递环境变量。例如: M-x compile
RET make -k CXXFLAGS='-Wall'
RET