创建 Cygwin Mx shell 子进程时让 GNU Emacs Windows 运行我的 ~/.bash_profile

创建 Cygwin Mx shell 子进程时让 GNU Emacs Windows 运行我的 ~/.bash_profile

我在 Windows 上使用 GNU Emacs,在 shell 中使用 Cygwin 来完成所有工作。Cygwin 使用的 ~/.profile 是 ~/.bash_profile。如果我通过运行 C:\cygwin\Cygwin.bat 启动 Cygwin shell,它会启动并正常执行 ~/.bash_profile。

我按照规定,将以下内容放入我的 ~/.emacs 中,在 Windows 上的 GNU Emacs 中设置了 Cygwin:

;; Set up Cygwin
(add-to-list 'load-path "C:/Program Files/emacs-site-lisp/cygwin")
(require 'setup-cygwin)

C:\Program Files\emacs-site-lisp 是我放置站点范围的 lisp 的地方(显然)。

当我运行 Mx shell 时,会在名为 *shell* 的缓冲区中创建一个 Cygwin bash 子进程。完美。但是,我的 ~/.bash_profile 未执行。

如何使 ~/.bash_profile 生效?

答案1

我能给出的最佳答案是一个解释.bash_profile和之间区别的链接.bashrchttp://joshstaiger.org/archives/2005/07/bash_profile_vs.html

这里有很多历史,其中一些与过去有关,当时我们拨入带有慢速调制解调器的系统,并且我们希望 shell 能够快速启动和运行。因此,我们希望使用快速设置的环境“登录”,然后生成完全配置的“子 shell”,因为从已登录的 shell 执行此操作更快。

在您的情况下,您的初始 shell 是作为登录 shell 启动的(请检查cygwin.bat-- 它正在使用 进行调用bash--login。但是 emacs 子 shell 并未作为登录 shell 启动。因此,只有您的.bashrc文件正在加载。

现在我认为大多数人只是将所有内容保存在 .bashrc 中,然后让 .bash_profile 加载它:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

但是,如果您采用这种方法,则需要小心不要重复附加到变量PATH。否则,每个子 shell 最终都会在上出现重复的条目,PATH并且您可能会得到需要搜索的非常长且混乱的变量,并且速度会变慢。

答案2

这是我的方法 - 而且很有效:

(setq explicit-bash-args '("--login" "--init-file" "c:/home/cbalz/.bash_profile" "-i"))

有人会认为“bash.exe”会在没有显式初始化文件的情况下运行“.bash_profile”,因为这是一个登录 shell(“--login”),而“bash.exe”确实能正确找到并执行“.bashrc”。但事实并非如此。由于“.bash_profile”源自“.bashrc”,因此解决方案是只运行“.bash_profile”。

我认为 Cygwin 应该运行一个 Windows 服务来管理环境变量,以便 shell 能够正确继承。

相关内容