Розбіжності 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 $PATHEmacs 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 як оболонку входу?
wasamasa

Не впевнений, що саме ви маєте на увазі під оболонкою для входу, але, мабуть, я зателефонував chsh...у той день, щоб змінити оболонку за замовчуванням
Галдер Замарреньо

Я використовую iTerm2 btw ...
Galder Zamarreño

2
Мабуть, ні, не змінюйте PATH у тому ~/.profileчи /etc/profileіншому випадку.
wasamasa

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

Відповіді:



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

Дякую всім!!


Завдяки Беон за його натяки в цьому $PATHна OSX пост .
Гальдер Замарреньо

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, але все ще існує думка щодо різниці між середовищем вашої оболонки та середовищем GUI. Як ви налаштуєте $PATHGUI, схоже, залежить від версії ОС. Однак ви можете використовувати:

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

у вашому, ~/.emacs.d/initякщо ви просто хочете рішення, яке має спрацювати.

PPS: Якщо ви хочете запустити оболонку в emacs, вам, ймовірно, краще скористатися, ansi-termа не використовувати shell.


Я сумніваюся, що питання стосується Linux, враховуючи, що запитуючий зазначив про використання iTerm 2 .
wasamasa

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

Ще один спосіб досягти цього - просто сказати оболонці, що це оболонка для входу, щоб вона джерела всіх потрібних файлів. Я роблю це для баш, встановивши 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.
mernst

1

Ви також можете встановити шлях за замовчуванням по всій ОС для 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.