7

Я использую MsysGit на Windows 7. У меня есть одна неприятная проблема. Весь файл bash_profile, кажется, выполняется дважды. например, у меня есть следующая строка эха в .bash_profile

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 выполняла операторы bash_profile только один раз?

3 ответа3

6

У меня была такая же проблема, и я заметил, что файла ~/.bashrc не было.

Создание пустого ~/.bashrc решило проблему:

touch ~/.bashrc

Я мог только догадываться, почему это сработало, но это сработало.

1

TL; DR - попробуйте удалить --login из вашего вызова bash


Если вы используете Git для Windows с ConEmu или Cmder, команда для запуска 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 . Git для Windows генерирует этот ~/.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 )


1

Я не знаком с тем, как это исправить в Windows, но если бы это была UNIX/Linux, вы могли бы сделать:

echo $PATH <br />

и посмотрите, откуда вы получаете двойную запись. Я предполагаю, что ваш .bash_profile добавляется к пути более одного раза. Если вы отследите, где путь обрабатывается, вы можете решить вашу проблему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .