我在 Windows 7 上使用 MsysGit。我遇到了一个恼人的问题。整个 bash_profile 文件似乎被执行了两次。例如,我在 .bash_profile 中有以下 echo 行
echo "Boinkk..."
如果我有
echo "Calvin..."
echo "Hobbes..."
然后我得到 所以我知道 .bash_profile 文件被执行了两次,而不是每个语句被执行了两次。“Git Bash”可执行文件的目标是
C:\Windows\System32\cmd.exe /c ""C:\Program Files\Software\Git\bin\sh.exe" --login -i"
有人知道我必须做什么才能让 bash shell 只执行一次 bash_profile 语句吗?
答案1
我不太熟悉如何在 Windows 上修复,但如果是 UNIX/Linux,你可以执行以下操作:
echo $PATH <br />
看看你从哪里得到重复条目。我猜想你的 .bash_profile 被多次添加到路径中。如果你追踪到路径被操纵的位置,你就可以解决问题。
答案2
我遇到了同样的问题,并发现没有 ~/.bashrc 文件。
创建一个空的 ~/.bashrc解决了该问题:
touch ~/.bashrc
我只能推测为什么它会起作用,但事实确实如此。
答案3
TL;DR — 尝试--login
从 bash 调用中删除
如果你在 Windows 上使用带有 ConEmu 或 Cmder 的 Git,启动 bash 的命令可能如下所示:
cmd /c ""%ConEmuDir%\..\git-for-windows\bin\bash" -i --login"
注意这--login
一点。显然,如果--login
传递给 bash,它将第一的执行来自的命令/etc/profile
,然后执行 、 或 — 中的一个,~/.bash_profile
以~/.bash_login
存在~/.profile
者为准。
现在,msys 提供了一个/etc/profile
,它执行 下的所有脚本/etc/profile.d
。Cmder 提供了/etc/profile.d/cmder.sh
,它执行~/.bashrc
(下面摘录)
# Source the users .bashrc file if it exists
if [ -f "${HOME}/.bashrc" ] ; then
. "${HOME}/.bashrc"
fi
这一切都是在 的执行过程中完成的/etc/profile
。之后,bash --login
将尝试执行~/.bash_profile
。Windows 版 Git 生成以下内容~/.bash_profile
:
# generated by Git for Windows
test -f ~/.profile && . ~/.profile
test -f ~/.bashrc && . ~/.bashrc
执行后,~/.bashrc
将第二次运行。
解决方案?--login
从 bash 的调用中删除在 Cmder/ConEmu 中,可以通过点击加号按钮旁边的向下箭头,在列表中找到你的 bash,然后将命令更改为:
cmd /c ""%ConEmuDir%\..\git-for-windows\bin\bash" -i"
如果没有该--login
位,bash 将跳过执行/etc/profile
,而只运行~/.bashrc
(...和/etc/bash.bashrc
,但 msys 不会~/.bashrc
在那里执行)