Встановлення змінних середовища в OS X для додатків GUI


16

Як можна налаштувати змінні середовища в Mac OS X таким чином, що вони доступні для додатків GUI без використання ~ / .MacOSX / Environment.plist або Гачок входу (оскільки вони застаріли )?


@ ersin-er Відповідь StackOverflow "Рішення як для командного рядка, так і для GUI-програм із одного джерела (працює з Yosemite & El Capitan)" може зацікавити людей, які знайшли це питання.
l --marc l

Відповіді:


15

На 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: Звичайно, ви повинні налаштувати запис "Шлях" під ваші конкретні потреби шляху.


Дякую! Це було ідеально для мене. 10.11 (El Capitan) мені довелося також виконувати команди, надані Метью , щоб побачити зміни, які набули Info.plistчинності.
dsedivec

8

Рішення використовує функціональність у 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 може бачити моє власне текс дерево. Речі, які можна вдосконалити:

  1. Скрипт оболонки має #filename="$1"в собі. Це не випадково, оскільки ім'я файлу слід подавати до сценарію запускним агентом як аргумент, але це не працює.

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

  3. Я не впевнений, наскільки безпечним є це рішення, оскільки воно використовується evalз наданими користувачем рядками.

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

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

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

Оновлення : наразі це не працює у версії 10.8. Орієнтовні рішення на основі заявки описуються тут і тут .


До речі, якщо потрібно визначити змінну PATH у середовищі терміналів і використовує цей запуск агент, я пропоную написати export PATH=.:"$(launchctl getenv PATH)"в ~ / .bash_profile (аналогічно для інших оболонок). Це можливо, оскільки path_helperвикликається в сценарії оболонки. Для отримання більш детальної інформації про змінну PATH в OS X перевірте цю відповідь .
Персиваль Улісс

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 за умови, що я запускаю наступні команди в Terminal після зміни файлу плістів.

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

killall Finder

Я мав таку саму поведінку з Ель-Капітан, і я додав вашу точку до відповіді @ 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застосовуються як до процесу запуску кореня, так і до процесів запуску користувача. Змінні середовища, встановлені setenvв /etc/launchd.conf, відображаються обома sudo launchctl exportта launchctl export.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.