1

Я использую GNU Emacs для Windows и Cygwin для оболочки, в которой я делаю всю свою работу. ~/.Profile, используемый Cygwin, это ~/.bash_profile. Если я запускаю оболочку Cygwin, запустив C:\cygwin\Cygwin.bat, она запускается и прекрасно выполняет ~/.bash_profile.

Я установил Cygwin в GNU Emacs для Windows, добавив в мои ~/.emacs следующее, как это предписано:

;; 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, подпроцесс Cygwin bash создается в буфере с именем * shell *. Отлично. Однако мой ~/.bash_profile не выполняется.

Как заставить эффект ~/.bash_profile вступить в силу?

2 ответа2

4

Лучший ответ, который я могу дать, - это ссылка, объясняющая различия между .bash_profile и .bashrc: http://joshstaiger.org/archives/2005/07/bash_profile_vs.html

Там много истории, и некоторые из них имеют отношение к "Старым дням", когда мы подключались к системам с медленными модемами и хотели, чтобы оболочка была запущена и работала быстро. Поэтому мы бы хотели "войти" в среду, которая была бы быстрой для настройки, а затем создать «суб-оболочки», которые были полностью настроены, потому что это было быстрее сделать из уже вошедшей в оболочку.

В вашем случае ваша начальная оболочка запускается как оболочка для входа (проверьте cygwin.bat - она вызывает bash с параметром --login). Но под-оболочка emacs не запускается как оболочка входа в систему. Таким образом, загружается только ваш файл .bashrc .

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

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

Но вы должны быть осторожны, чтобы не повторять переменные, например PATH если вы используете этот подход. В противном случае каждая вложенная оболочка заканчивается дублирующимися записями в PATH и вы можете получить действительно длинные и недисциплинированные переменные, которые нужно искать, и все замедляется.

2

Вот как я это делаю - и это работает:

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

Можно подумать, что «bash.exe» будет запускать «.bash_profile» без явного файла инициализации, поскольку это оболочка входа в систему («--login»), а «bash.exe» правильно находит и выполняет «.bashrc». Это не тот случай, однако. Поскольку '.bash_profile' содержит '.bashrc', решение состоит в том, чтобы просто запустить '.bash_profile'.

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

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