在我的 Mac 上的 Emacs 中,“编译命令”如何看到在 ~/.bashrc 中设置的 PATH?

在我的 Mac 上的 Emacs 中,“编译命令”如何看到在 ~/.bashrc 中设置的 PATH?

在我的 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,因为编译使用非交互式 shellbash.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调用您。.bashrccompile

为 OS X Mavericks 应用程序设置环境变量本身似乎有点冒险。我最终决定将其放在我的.emacs文件中,例如:

(setenv "BASH_ENV" "$HOME/.bashrc")

答案2

我当前的解决方法是:

Meta-x compile source ~/.bashrc; cd ~/myCode/src; make

不过,我还是想了解为什么Meta-x compile不反映的内容.bashrc

相关内容