在我的 Mac OSX Mavericks 上的 Emacs v23.4.1 中,如何Meta-x compile
查看$PATH
~/.bashrc 中设置的 bash?目前PATH=/usr/bin:/bin:/usr/sbin:/sbin
是这样的,而在普通 shell 中PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/adt-bundle-mac-x86_64-20130522/sdk/tools:/Applications/adt-bundle-mac-x86_64-20130522/sdk/platform-tools:/Applications/adt-bundle-mac-x86_64-20130522/sdk/tools:/Applications/adt-bundle-mac-x86_64-20130522/sdk/platform-tools
令人惊讶的是,传递bash -c "echo $PATH"
给Compile Command
仍然给出/usr/bin:/bin:/usr/sbin:/sbin
。
为什么 Emacs 不使用我的 ~/.bashrc 作为编译命令,并且它使用的另一个初始化文件是否也被普通 bash shell 使用? 创建的 shell 有何不同Compile Command
。
答案1
compile
不调用.bashrc
,因为编译使用非交互式 shell和bash
当.bashrc
作为交互的非登录 shell。
幸运的是,bash
确实有一种通过环境变量初始化非交互式 shell 的机制BASH_ENV
:
例如,当以非交互方式启动 Bash 以运行 shell 脚本时,它会
BASH_ENV
在环境中查找变量,如果变量出现则扩展其值,并使用扩展的值作为要读取和执行的文件的名称。Bash 的行为就像执行了以下命令一样:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但变量的值
PATH
不用于搜索文件名。
因此,如果您将BASH_ENV
环境变量设置为,它应该在子 shell中$HOME/.bashrc
调用您。.bashrc
compile
为 OS X Mavericks 应用程序设置环境变量本身似乎有点冒险。我最终决定将其放在我的.emacs
文件中,例如:
(setenv "BASH_ENV" "$HOME/.bashrc")
答案2
我当前的解决方法是:
Meta-x compile
source ~/.bashrc; cd ~/myCode/src; make
不过,我还是想了解为什么Meta-x compile
不反映的内容.bashrc
。