Як можна налаштувати змінні середовища в Mac OS X таким чином, що вони доступні для додатків GUI без використання ~ / .MacOSX / Environment.plist або Гачок входу (оскільки вони застаріли )?
Як можна налаштувати змінні середовища в Mac OS X таким чином, що вони доступні для додатків GUI без використання ~ / .MacOSX / Environment.plist або Гачок входу (оскільки вони застаріли )?
Відповіді:
На 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: Звичайно, ви повинні налаштувати запис "Шлях" під ваші конкретні потреби шляху.
Info.plist
чинності.
Рішення використовує функціональність у 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>
Одне важливе - це ключ 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
команди, для отримання додаткової інформації див. Його сторінку. Працює добре для мене (я повинен згадати , що я до сих пір Snow Leopard хлопець), графічні додатки , такі як texstudio і TeXShop може бачити моє власне текс дерево. Речі, які можна вдосконалити:
Скрипт оболонки має #filename="$1"
в собі. Це не випадково, оскільки ім'я файлу слід подавати до сценарію запускним агентом як аргумент, але це не працює.
Як уже згадувалося тут (німецька та за платною!), Сценарій можна запустити в сам запуск агента.
Я не впевнений, наскільки безпечним є це рішення, оскільки воно використовується eval
з наданими користувачем рядками.
Я думаю, пам’ятаю, що визначення MANPATH за допомогою цього методу не спрацювало добре, але я не впевнений.
Слід зазначити, що Apple задумала дещо подібний підхід, розмістивши матеріали у ∼ / launchd.conf , але наразі це не підтримується щодо цієї дати та ОС (див. Сторінку сторінки launchd.conf
). Я здогадуюсь, що такі речі, як глобалізація, не діятимуть так, як це робиться в цій пропозиції. І звичайно, ви можете розмістити ці файли в будь-якому іншому місці, крім агента запуску, який повинен знаходитися в / Бібліотека / LaunchAgents / або ~ / Бібліотека / LaunchAgents / .
Нарешті, слід зазначити джерела, які я використовував як інформацію про агенти запуску: 1 , 2 , 3 , 4 .
Оновлення : наразі це не працює у версії 10.8. Орієнтовні рішення на основі заявки описуються тут і тут .
export PATH=.:"$(launchctl getenv PATH)"
в ~ / .bash_profile (аналогічно для інших оболонок). Це можливо, оскільки path_helper
викликається в сценарії оболонки. Для отримання більш детальної інформації про змінну PATH в OS X перевірте цю відповідь .
Відповідь, надана @ 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 за умови, що я запускаю наступні команди в Terminal після зміни файлу плістів.
/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
застосовуються як до процесу запуску кореня, так і до процесів запуску користувача. Змінні середовища, встановлені setenv
в /etc/launchd.conf
, відображаються обома sudo launchctl export
та launchctl export
.