Установка переменных среды в OS X для приложений с графическим интерфейсом

16

Как настроить переменные среды в Mac OS X так, чтобы они были доступны для приложений с графическим интерфейсом без использования ~ / .MacOSX / environment.plist или же Крючки для входа (так как это осуждается )?

Percival Ulysses
источник
@ ersin-er Ответ от StackOverflow «Решение как для командной строки, так и для приложений с графическим интерфейсом из одного источника (работает с Yosemite & El Capitan)» может представлять интерес для людей, которые находят этот вопрос.
l --marc l

Ответы:

13

На горе льва /etc/paths а также /etc/launchd.conf редактирование не имеет никакого эффекта!

Форумы разработчиков Apple говорят:

"Изменить Info.plist самого .app, чтобы он содержал" LSEnvironment "   словарь с переменными среды вы хотите.

~ / .MacOSX / environment.plist больше не поддерживается. "

Так что я непосредственно отредактировал приложение Info.plist (щелкните правой кнопкой мыши «AppName.app» (в данном случае SourceTree) и затем « Show package contents «)

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 )

enter image description here

теперь приложение (в моем случае SourceTree) использует указанный путь и работает с git 1.9.3 :-)

PS: Конечно, вы должны настроить запись пути в соответствии с вашими потребностями.

Flori
источник
Спасибо! Это было идеально для меня. 10 ноября (Эль-Капитан) мне тоже пришлось бежать команды, предоставленные Мэтью чтобы увидеть мои изменения Info.plist вступить в силу.
dsedivec
7

Решение использует функциональность launchctlв сочетании с Агент запуска имитировать учетные записи старых. Для других решений, использующих магазин 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 получить ДОРОЖКА настроить правильно. В заключение, ~ / .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 можно увидеть мое собственное текстовое дерево. Вещи, которые можно улучшить:

  1. Сценарий оболочки имеет #filename="$1" в этом. Это не случайно, так как агент запуска должен указать имя файла в сценарии в качестве аргумента, но это не работает.

  2. Как уже упоминалось Вот (Немецкий и за платным экраном!), Сценарий можно поместить в агент запуска самостоятельно.

  3. Я не уверен, насколько безопасно это решение, так как оно использует eval с предоставленными пользователем строками.

  4. Я думаю, что нужно помнить, что определение MANPATH с использованием этого метода не сработало, но я не уверен.

Следует отметить, что Apple намеревалась сделать несколько похожий подход, ~ / Launchd.conf , но в настоящее время не поддерживается в отношении этой даты и ОС (см. страницу руководства launchd.conf ). Я полагаю, что такие вещи, как глобализация, не будут работать так, как в этом предложении. И, конечно, эти файлы можно разместить где угодно, кроме агента запуска, который должен находиться в / Library / LaunchAgents / или же ~ / Library / LaunchAgents / ,

Наконец, я должен упомянуть источники, которые я использовал в качестве информации об Launch Agents: 1 , 2 , 3 , 4 ,

Обновить : Это не работает в версии 10.8 на данный момент. Обходные пути для каждого приложения описаны Вот а также Вот ,

Percival Ulysses
источник
Кстати, если кто-то хочет определить переменную PATH в среде терминала и использует этот агент запуска, я предлагаю написать export PATH=.:"$(launchctl getenv PATH)" в ~ / .bash_profile (аналогично для других оболочек). Это возможно с path_helper вызывается в сценарии оболочки. Для получения дополнительной информации о переменной PATH в OS X, проверьте этот ответ ,
Percival Ulysses
2

Ответ, предоставленный @ percival-ulysses, работает для меня на 10.9 Mavericks со следующим небольшим изменением: edit /Users/Shared/conflaunchd.sh сценарий прямо перед exit 0 и добавьте строки

killall Dock
killall SystemUIServer

перезапустить док и менубар. После этого приложения, запущенные из Dock или из Spotlight, будут наследовать правильный PATH. Если вы используете Finder для запуска критически важных приложений, то killall Finder может быть добавлено тоже.

в .bash_profile Я использую линию

export PATH=`launchctl getenv PATH`

чтобы установить ПУТЬ для терминала, таким образом, ПУТЬ управляется из того же места, ~ / .Conf.launchd файл.

Ury Marshak
источник
2

Ответ, предоставленный @flori, работает для меня на Maverick при условии, что я запустил следующие команды в Терминале после изменения файла plist

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 

killall Finder
Matthew
источник
У меня было такое же поведение с El Capitan, и я добавил вашу точку зрения к ответу @ flori
Seki
0

Другой вариант заключается в использовании /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,

Lri
источник