
Как настроить переменные среды в Mac OS X так, чтобы они были доступны для приложений с графическим интерфейсом без использования~/.MacOSX/environment.plistилиВход в систему Хуки(так как этоустаревший)?
решение1
На Mountain Lion все эти /etc/paths
и /etc/launchd.conf
другие изменения не дают никакого эффекта!
На форумах разработчиков Apple говорится:
«Измените Info.plist самого .app так, чтобы он содержал словарь «LSEnvironment» с нужными вам переменными среды.
~/.MacOSX/environment.plist больше не поддерживается."
Поэтому я напрямую отредактировал приложение Info.plist
(щелкните правой кнопкой мыши на «AppName.app» (в данном случае SourceTree), а затем « Show package contents
»)
и добавил новую пару ключ/словарь под названием:
<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: Конечно, вам придется настроить запись Path в соответствии с вашими конкретными потребностями.
решение2
Решение использует функциональность launchctl
в сочетании сЗапустить Агентадля имитации старых хуков входа. Для других решений, использующих хранилище launchd
, см.это сравнение. Используемый здесь пусковой агент находится в/Библиотека/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>
Одна важная вещь - этоЗапуск при загрузкеключ, чтобы агент запуска был выполнен как можно раньше. Реальная работа выполняется в скрипте оболочки/Пользователи/Общий/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
to getПУТЬнастроено правильно. Наконец,~/.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
команды, см. страницу руководства для получения дополнительной информации. Работает отлично для меня (я должен отметить, что я все еще парень Snow Leopard), приложения GUI, такие какtexstudioиTeXShopможно увидеть мое собственное дерево текс. Что можно улучшить:
В скрипте оболочки есть
#filename="$1"
. Это не случайно, так как имя файла должно быть передано скрипту агентом запуска в качестве аргумента, но это не работает.Как уже упоминалосьздесь(на немецком языке и с платным доступом!), можно поместить скрипт в сам агент запуска.
Я не уверен, насколько безопасно это решение, поскольку оно использует
eval
строки, предоставленные пользователем.Думаю, стоит помнить, что определение MANPATH с использованием этого метода не сработало как следует, но я в этом не уверен.
Следует отметить, что Apple намеревалась использовать несколько похожий подход, помещая материалы в∼/launchd.conf, но в настоящее время он не поддерживается для этой даты и ОС (см. man-страницу launchd.conf
). Я предполагаю, что такие вещи, как подстановка, не будут работать так, как они работают в этом предложении. И, конечно, можно разместить эти файлы где угодно, за исключением агента запуска, который должен находиться в/Библиотека/LaunchAgents/или~/Библиотека/LaunchAgents/.
Наконец, я должен упомянуть источники, которые я использовал в качестве информации о Launch Agents: 1,2,3,4.
Обновлять: В версии 10.8 это пока не работает. Описаны обходные пути для каждого приложенияздесьиздесь.
решение3
Ответ, предоставленный @flori, работает у меня на Maverick при условии, что я выполню следующие команды в терминале после изменения файла plist
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
решение4
Другой вариант — использовать /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
применяются как к корневому процессу launchd, так и к процессам launchd для каждого пользователя. Переменные среды, заданные с помощью setenv
в, /etc/launchd.conf
отображаются как sudo launchctl export
и launchctl export
.