![创建 Cygwin Mx shell 子进程时让 GNU Emacs Windows 运行我的 ~/.bash_profile](https://linux22.com/image/1250776/%E5%88%9B%E5%BB%BA%20Cygwin%20Mx%20shell%20%E5%AD%90%E8%BF%9B%E7%A8%8B%E6%97%B6%E8%AE%A9%20GNU%20Emacs%20Windows%20%E8%BF%90%E8%A1%8C%E6%88%91%E7%9A%84%20~%2F.bash_profile.png)
我在 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
和之间区别的链接.bashrc
:http://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 能够正确继承。