Как настроить переменные среды в Mac OS X так, чтобы они были доступны для приложений с графическим интерфейсом без использования ~/.MacOSX/environment.plist или вход в систему (поскольку они устарели)?
5 ответов
На Mountain Lion редактирование всех /etc/paths
и /etc/launchd.conf
не дает никакого эффекта!
Форумы разработчиков Apple говорят:
Msgstr "Измените Info.plist самого .app, чтобы он содержал словарь" LSEnvironment "с необходимыми переменными среды.
~/.MacOSX/environment.plist больше не поддерживается. "
Поэтому я непосредственно отредактировал Info.plist
приложения (щелкните правой кнопкой мыши «AppName.app» (в данном случае SourceTree), а затем « Show package contents
»)
и добавил новую пару ключ /dict под названием:
<key>LSEnvironment</key>
<dict>
<key>PATH</key>
<string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>
(см .: Документация по LaunchServicesKeys в Apple)
теперь приложение (в моем случае SourceTree) использует указанный путь и работает с git 1.9.3 :-)
PS: Конечно, вы должны настроить запись пути в соответствии с вашими потребностями.
В решении используется функциональность launchctl
сочетании с Launch Agent для имитации старых хуков входа в систему. Для других решений, использующих магазин launchd
, посмотрите это сравнение.
Используемый здесь агент запуска находится в /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>Label</key>
<string>user.conf.launchd</string>
<key>Program</key>
<string>/Users/Shared/conflaunchd.sh</string>
<key>ProgramArguments</key>
<array>
<string>~/.conf.launchd</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>StandardIO</string>
</array>
</dict>
</plist>
Одна важная вещь - это ключ RunAtLoad, чтобы агент запуска был запущен как можно раньше.
Настоящая работа выполняется в сценарии оболочки /Users/Shared/conflaunchd.sh, который читает ~/.conf.launchd и передает его в launchctl
:
#! /bin/bash
#filename="$1"
filename="$HOME/.conf.launchd"
if [ ! -r "$filename" ]; then
exit
fi
eval $(/usr/libexec/path_helper -s)
while read line; do
# skip lines that only contain whitespace or a comment
if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi
eval launchctl $line
done <"$filename"
exit 0
Обратите внимание на вызов path_helper
для правильной настройки PATH . Наконец, ~/.conf.launchd выглядит так
setenv PATH ~/Applications:"${PATH}"
setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:
# Locale
setenv LANG en_US.UTF-8
Это команды launchctl
, см. Его man-страницу для получения дополнительной информации. У меня отлично работает (я должен отметить, что я все еще парень из Snow Leopard), приложения с графическим интерфейсом, такие как texstudio и TeXShop, могут видеть мое собственное дерево текстов . Вещи, которые можно улучшить:
В сценарии оболочки есть
#filename="$1"
. Это не случайно, так как агент запуска должен указать имя файла в сценарии, но это не работает.Как упомянуто здесь (на немецком языке и за платным доступом!), Скрипт можно поместить в агент запуска самостоятельно.
Я не уверен, насколько безопасно это решение, так как оно использует
eval
с предоставленными пользователем строками.Я думаю, что нужно помнить, что определение MANPATH с использованием этого метода не сработало, но я не уверен.
Следует отметить, что Apple намеревалась сделать подобный подход, поместив материал в ∼ /launchd.conf, но в настоящее время он не поддерживается в отношении этой даты и ОС (см. launchd.conf
). Я предполагаю, что такие вещи, как глобализация, не будут работать так, как в этом предложении. И, конечно, эти файлы можно поместить куда угодно, кроме агента запуска, который должен находиться в /Library /LaunchAgents / или ~ /Library /LaunchAgents /.
Наконец, я должен упомянуть источники, которые я использовал в качестве информации об агентах запуска:1, 2, 3, 4.
Обновление: в настоящее время это не работает в версии 10.8. Обходные пути для каждого приложения описаны здесь и здесь.
Ответ, предоставленный @ percival-ulysses, работает для меня на 10.9 Mavericks со следующим небольшим изменением: отредактируйте скрипт /Users/Shared/conflaunchd.sh прямо перед exit 0
и добавьте строки
killall Dock
killall SystemUIServer
перезапустить док и меню. После этого приложения, запущенные из Dock или из Spotlight, будут наследовать правильный PATH. Если вы используете Finder для запуска критических по PATH приложений, тогда может быть добавлен killall Finder
.
В .bash_profile
я использую строку
export PATH=`launchctl getenv PATH`
чтобы установить PATH для терминала, таким образом, PATH контролируется из того же места, файла ~/.conf.launchd .
Ответ, предоставленный @flori, работает для меня на Maverick, если после изменения файла plist я запускаю следующие команды в Терминале
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
Другой вариант - использовать /etc/launchd.conf
. Например, я изменил PATH
по умолчанию, добавив эту строку в /etc/launchd.conf
:
setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin
Вы можете применить изменения к /etc/launchd.conf
, перезапустив или запустив launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
и завершение и повторный запуск процессов.
Параметры в /etc/launchd.conf
применяются как к процессу запуска с правами root, так и к процессам запуска на уровне пользователя. Переменные среды, установленные с помощью setenv
в /etc/launchd.conf
, отображаются как sudo launchctl export
и launchctl export
.