Після того як я розібрався з проблемами 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.