16

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

5 ответов5

13

На 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: Конечно, вы должны настроить запись пути в соответствии с вашими потребностями.

7

В решении используется функциональность 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, могут видеть мое собственное дерево текстов . Вещи, которые можно улучшить:

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

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

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

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

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

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

Обновление: в настоящее время это не работает в версии 10.8. Обходные пути для каждого приложения описаны здесь и здесь.

2

Ответ, предоставленный @ 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 .

2

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

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

killall Finder
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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .