Чому в OSX Yosemite чому я можу встановити багато змінних середовища для додатків GUI, але не можу встановити конкретну змінну PATH


16

Після того як я розібрався з проблемами PATH OSX до виходу Mavericks, проблеми повернулися в Yosemite !!!

Тому я хочу імітувати стару launch.confфункцію у новій версії YOSMITE 10.10 для Mac OSX 10.10, щоб мати змінну середовища PATH у додатках GUI, таких як Carbon Emacs або RStudio . Я використовував чудову ідею користувача ucse stackoverflow, щоб створити скрипт оболонки, який налаштовує змінні середовища через launchctl. (Дивіться його відповідь stackoverflow тут .) Це працює для більшості змінних середовища, але не для змінної PATH .

1. Що я зробив?

Спочатку я написав /etc/environment.rcсценарій так:

launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"

Потім я створив списки для launchd(списки цих та інших згаданих сценаріїв у додатку нижче). Потім я їх активував

$ sudo launchctrl load ...

Тоді я відключив path_helperутиліту у /etc/профілі файлу shell init , щоб він не переписав environment.rcналаштування. І нарешті я перезапустив машину.

2. Який ефект?

Коли я запускаю Terminal, нові змінні середовища JAVA_HOMEі ENVIRONMENT_RCвстановлюються відповідно до environment.rc, але PATH встановлений

/ usr / bin: / bin

Для того, щоб переконатися, жоден bashфайл init не потрапив так, як я написав натомість маленький скрипт python (а також у додатку), щоб показати змінні в поточному середовищі, і я виконую це безпосередньо, двічі клацнувши обгортку Platypus . Знову встановлюються нові змінні, тоді як PATH має системний стандарт.

То чому я можу встановити інші змінні, але не змінну PATH? І як я можу це вирішити уніфікованим способом ?

Оновлення:

Ситуація дуже дивовижна: оболонка ( bashпринаймні) в Terminal або Emacs підбере PATH, який ви встановите через launchctl, але інші додатки GUI цього не робитимуть. шлях. І навіть сам Emacs не знає правильного PATH: Ви помічаєте це, наприклад, коли ви видаєте команду Emacs M-x ispell-buffer; інструмент unix, ispellякий намагається викликати emacs, не знайдеться, якщо він знаходиться просто на вашому користувальницькому шляху.


Додаток

net.halloleo.environment.plist, файл запуску config у /Library/LaunchDaemons/:

<?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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

net.halloleo.environment-user.plist, файл запуску config у /Library/LaunchAgents/:

<?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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment-user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

/etc/profile, модифікований файл запуску bash:

# System-wide .profile for sh(1)

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
# fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

show_environ.py, скрипт, що відображає всі змінні середовища:

import os
print (os.environ)

Відповіді:


3

PATH в Yosemite можна і потрібно встановлювати у файлі / etc / paths. Просто додайте шлях до кінця цього файлу:

/usr/bin
/bin
/your/custom/path

/ etc / сценарій середовища в оригінальному пості забезпечує підтримку змінної PATH у додатках GUI (тестовано з Emacs).


5
Це працює лише для оболонок, які викликають /usr/libexec/path_helperпід час процесу ініціалізації. Програми GUI не отримують PATH згідно /etc/paths- і я запитав спеціально про програми GUI.
halloleo

Я оновив сценарій відповідей та / тощо / оточення в оригінальній публікації
ursa

Це дві відповіді, які ви даєте - також ОП каже / тощо / оточення не працює
Марк

@mark (1) після цього питання піднімався я оновив / etc / Environment, і тепер він підтримує PATH. (2) відповідь тут полягає у використанні / etc / paths
ursa

2
@mark Так, і це якраз моя суть, проблема і питання: Як я можу встановити змінну оточення PATH самих програм GUI при запуску через Finder? І все-таки ніякого реального загального рішення для цього не видно ...
halloleo

2

Це довго спантеличувало мене (ну, останні пару годин). Врешті-решт я зіткнувся з цим звітом про помилку, який, схоже, точно описує мою проблему (я не впевнений, з якою мірою це пов’язано з вашою проблемою, але, здається, в Yosemite / запускається помилка в поєднанні з PATH та такими сценаріями як пітон:

http://www.openradar.me/18945659

Здається, рішення полягає в запуску скрипту оболонки, який потім запускає пітон. Не дуже, що мені подобається, але це так, як це….


Дякуємо за посилання на звіт про помилку. Добре, що зараз це справжня помилка. Я знайшов ще одну кладку навколо неї; Я опублікую його тут.
halloleo

1

Проблема полягає в тому, що запуск додає іншу змінну PATH замість заміни такої в оточенні. Більшість програм, getenvякі завжди повертають перше виникнення змінної, оболонки замість цього повторюють усі змінні середовища та імпортують їх як локальні змінні, перезаписуючи попередні екземпляри останніми.

Очевидно, це помилка при запуску, змінні середовища, передані програмі, повинні бути унікальними.


1
Класна відповідь фону! Я здогадуюсь, що Теер не є справжнім способом навколо нього в оболонках, чи є?
halloleo

@halloleo Ви можете запустити команду, sh -c 'YOUR ORIGINAL COMMAND'яка передає її через оболонку, підбираючи PATHнабір у запуску.
StenSoft
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.