Emacs и разногласия командной строки $ PATH в OSX


18

Возникли некоторые проблемы с PATHнастройками в Emacs, которые влияют на мою среду на Haskell:

Я использую ZSH, и когда я иду в командную строку и вызываю echo $PATH, он возвращает:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Это исходит из .zprofileконфигурации, где у меня есть:

# Set the list of directories that Zsh searches for programs.
path=(
  ~/Library/Haskell/bin
  /usr/local/{bin,sbin}
  $path
)

Итак, из командной строки, когда я звоню which cabal, я правильно получаю:/Users/g/Library/Haskell/bin/cabal

Когда я запускаю Emacs и перехожу на shellвызовы which cabal, я получаю: /usr/bin/cabalчто вызывает у меня проблемы, так как это другая версия.

Когда я проверяю echo $PATHиз Emacs shell, я вижу:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

Я понятия не имею, как на земле PATHможет быть иначе ...

Кто-нибудь знает, как заставить мою ZSHоболочку и Emacs договориться об одном и том же PATH? Я подозреваю, что именно это контролирует, откуда cabalзагружается.

ОБНОВИТЬ : Запуск echo $SHELLиз печати Emacs:/bin/zsh

ОБНОВЛЕНИЕ 2 : это на OSX .

ОБНОВЛЕНИЕ 3 : я пытался использовать модуль exec-path-from-shell, и он не работает. У меня все еще есть те же проблемы, и, как побочный эффект, он портит цвета моей терминальной темы :(

ОБНОВЛЕНИЕ 4 : Я установил Emacs через brew install --cocoa --srgb emacsи запускаю emacs, который связан следующим образом:

~ ❯❯❯ which emacs
/usr/local/bin/emacs
~ ❯❯❯ l /usr/local/bin/emacs
lrwxr-xr-x  1 g  admin    30B 29 Jan 18:34 /usr/local/bin/emacs -> ../Cellar/emacs/24.4/bin/emacs
~ ❯❯❯ l /usr/local/Cellar/emacs/24.4/bin/emacs
-r-xr-xr-x  1 g  admin    87B 29 Jan 18:34 /usr/local/Cellar/emacs/24.4/bin/emacs

Вы используете ZSH в качестве оболочки для входа?
Васамаса

Не уверен, что именно вы подразумеваете под оболочкой входа в систему, но я думаю, что я chsh...перезвонил в тот день, чтобы изменить мою оболочку по умолчанию
Galder Zamarreño

Я использую iTerm2, кстати ...
Galder Zamarreño

2
Видимо, нет, измените PATH в ~/.profileили /etc/profileзатем.
Васамаса

1
Задайте переменные среды ~/.zshenv, которые будут поступать последовательно, независимо от того, запущена ли оболочка (интерактивная или неинтерактивная). Если exec-path-from-shellэто портя ваши терминальные цвета темы, вы можете установить , exec-path-from-shell-argumentsчтобы nilперед вызовом , exec-path-from-shell-initializeчтобы убедиться , что он не работает интерактивные части вашего ЗШ конфигурации.
sanityinc

Ответы:


14

Вы также можете установить пакет exec-path-from-shell и добавить его в файл инициализации:

(exec-path-from-shell-initialize)

1
Вопрос был бы лучше со ссылкой на цитируемый пакет .
Дрю

Вы правы, я только что отредактировал свой ответ.
Басак

1
Это все, что я когда-либо хотел.
djhaskin987

8

Это проблема среды OSX, которая $PATHпоявляется в Emacs из /etc/pathsфайла, который затем добавляется к тому, что я установил в оболочке. Я добавил /Users/g/Library/Haskell/binв начало /etc/pathsфайла, и он работал нормально.

Заходя в раковину и зовя echo $PATH в Emacs теперь показывает:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

И cabalверсия действительноcabal-install version 1.22.2.0 : D

Спасибо всем!!


Спасибо beOn за его подсказки в этом посте$PATH OSX .
Galder Zamarreño

2
Лучшее решение - изменить путь в ~/.zshenv. Изменения там отражены в PATH Emacs
Galder Zamarreño

Я могу подтвердить, что простое выполнение echo export PATH=$PATH > ~/.zshenvзаставляет Emacs M-x shellподнять его при следующем вызове.
Линус Арвер

5

Если вы запустите emacs из среды GUI (gnome, kde, ...), ваши сценарии запуска оболочки не будут добавлены в вашу среду. Так $PATHчто то, что вы аккуратно установили у себя .zsh, не будет загружено. Среды графического интерфейса обычно не получают их, хотя они могут загрузить ваш~/.profile файл.

Вы можете попробовать добавить это к вашему .pam_environment:

PATH DEFAULT=${PATH}:/MYHOMEDIR/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin

Вам нужно будет перезапустить сеанс GUI, чтобы загрузить его.

Этот документ может помочь вам $PATHправильно установить переменную:

https://help.ubuntu.com/community/EnvironmentVariables#Session-wide_environment_variables

Я использую этот ~/.pam_environmentфайл для переменных управляемого окружения, которые мне нужны, чтобы они были доступны из процессов оболочки или emacs.

PS: проницательный комментатор указывает, что вы, вероятно, на Mac. Я не знаю, как настроить ваш $PATHкомпьютер в графическом интерфейсе Mac, но все еще стоит вопрос о разнице между средой вашей оболочки и средой графического интерфейса. То, как вы настроили $PATHграфический интерфейс, зависит от версии ОС. Однако вы можете использовать:

(setenv "PATH" (concat (getenv "PATH") ":/foo/bar"))

в вашем, ~/.emacs.d/initесли вы просто хотите решение, которое должно работать.

PPS: Если вы хотите запустить оболочку в emacs, вам лучше использовать, ansi-termа не shell.


Я сомневаюсь, что вопрос о Linux, учитывая, что спрашивающий упомянул использование iTerm 2 .
Васамаса

3

Если какая-то часть PATH потеряна, вы можете добавить ее в ваш ~ / .emacs

;;; We add /path/to/something/extra by appending it to the path
(setenv "PATH" (concat (getenv "PATH") ":/path/to/something/extra"))
;;; /path/to/something/extra is now at the end of the PATH.
;;; or you can use:
;(setenv "PATH" (concat "/path/to/something/extra:" (getenv "PATH")))
;;; /path/to/something/extra is now at the beginning of the PATH.

Чтобы избежать проблем с PATH, я всегда запускаю emacs из командной строки, экспортируя PATH из ~ / .bashrc.


2

Еще один способ сделать это - просто сообщить оболочке, что это оболочка входа в систему, чтобы получать все нужные файлы. Я делаю это для bash, установив explicit-bash-argsв ("--noediting" "--login"). Похоже, что для zsh будет установлено explicit-zsh-argsзначение ("-l").

Так по моему .emacs:

(setq explicit-bash-args '("--noediting" "--login"))

По вашему, что-то вроде:

(setq explicit-zsh-args '("-l"))

Я думаю, что в "--noediting"этом нет необходимости, и, похоже, нет способа рассказать об этом zsh, но это может быть чем-то, что нужно исследовать, если это не сработает так, как вы надеетесь.


1
Это работает для оболочки, запускаемой под Emacs. Он не работает для команд, запускаемых непосредственно в Emacs, таких как via M-x shell-command.
Мернст

1

Вы также можете установить путь по умолчанию для OS X, например, сохранив список свойств следующим образом ~/Library/LaunchAgents/my.startup.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Новый путь должен отображаться в оболочках, Emacs и других приложениях после выхода и повторного входа.

Этот метод не изменяет путь в приложениях, которые открываются как элементы входа в систему или когда приложения открываются при входе в систему после принудительного завершения работы. Если у вас есть Emacs, терминальное приложение или другие приложения, в которых вы хотите изменить путь в элементах входа в систему, вам придется их удалить.

В 10.9 и более ранних версиях вы также можете добавить следующую строку /etc/launchd.conf:

setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Однако поддержка /etc/launchd.confбыла удалена в 10.10.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.