.bash_profile 语句执行两次

.bash_profile 语句执行两次

我在 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在那里执行)


相关内容