В Emacs v23.4.1 на моем Mac OSX Mavericks, как Meta-x compile видеть $PATH для bash, как установлено в моем ~/.bashrc? Сейчас PATH=/usr/bin:/bin:/usr/sbin:/sbin тогда как в обычной оболочке это PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/adt-bundle-mac-x86_64-20130522/sdk/tools:/Applications/adt-bundle-mac-x86_64-20130522/sdk/platform-tools:/Applications/adt-bundle-mac-x86_64-20130522/sdk/tools:/Applications/adt-bundle-mac-x86_64-20130522/sdk/platform-tools

Удивительно, но передача bash -c "echo $PATH" в команду Compile Command все равно дает /usr/bin:/bin:/usr/sbin:/sbin .

Почему Emacs не использует мой ~/.bashrc для команды compile, и есть ли другой файл инициализации, который он использует, который также используется обычными оболочками bash? Чем отличается оболочка, созданная командой Compile Command .

2 ответа2

1

compile не вызывает .bashrc потому что при компиляции используется неинтерактивная оболочка, а bash вызывает .bashrc когда вызывается как интерактивная оболочка без входа в систему.

К счастью, в bash есть механизм инициализации неинтерактивных оболочек через переменную окружения BASH_ENV:

Когда Bash запускается неинтерактивно, например, для запуска сценария оболочки он ищет переменную BASH_ENV в среде, расширяет ее значение, если оно там появляется, и использует расширенное значение в качестве имени файла для чтения и выполнения. , Bash ведет себя так, как будто была выполнена следующая команда:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

но значение PATH не используется для поиска имени файла.

Поэтому, если вы установите переменную окружения BASH_ENV в $HOME/.bashrc она должна вызывать ваш .bashrc в под-оболочке compile .

Задание переменных среды для приложений OS X Mavericks само по себе кажется чем-то вроде приключения. В конце концов я прибег к этому в моем файле .emacs , например:

(setenv "BASH_ENV" "$HOME/.bashrc")
0

Моя текущая работа заключается в следующем:

Исходный код для Meta-x compile source ~/.bashrc; cd ~/myCode/src; make

Но я все еще хотел бы понять, почему Meta-x compile не отражает содержимое .bashrc .

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