Після того як я розібрався з проблемами 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)
/usr/libexec/path_helperпід час процесу ініціалізації. Програми GUI не отримують PATH згідно/etc/paths- і я запитав спеціально про програми GUI.