Відповіді:
Створіть environment.plist
файл ~/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>my.startup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>
launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
launchctl setenv PATH $PATH:/Applications/gradle/bin
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Ви можете додати багато launchctl
команд всередині <string></string>
блоку.
plist
Активується після перезавантаження системи. Ви також можете launchctl load ~/Library/LaunchAgents/environment.plist
негайно запустити його.
[Редагувати]
Це ж рішення працює і в Ель-Капітан.
Xcode 7.0+ не за замовчуванням оцінює змінні середовища. Стару поведінку можна включити за допомогою цієї команди:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Редагувати]
Існує пара ситуацій, коли це не зовсім працює. Якщо комп'ютер перезапущено і вибрано "Повторно відкрити вікна при вході в систему", повторно відкриті вікна можуть не бачити змінних (можливо, вони відкриваються до запуску агента). Крім того, якщо ви увійдете через ssh, змінні не будуть встановлені (тому вам потрібно буде встановити їх у ~ / .bash_profile). Нарешті, це, здається, не працює для PATH на Ель-Капітан та Сьєрра. Це потрібно встановити через "startctl config user path ..." та в / etc / paths.
UseSanitizedBuildSystemEnvironment
).
[ Оригінальна відповідь ]: Ви все одно launchctl setenv variablename value
можете встановити змінну так, щоб її забрали всі програми (графічні програми, запущені через док-станцію або прожектор, на додаток до запущених через термінал).
Очевидно, що ви не хочете робити цього кожного разу, коли будете входити в систему.
[ Редагувати ]: Щоб уникнути цього, запустіть AppleScript Editor
, введіть таку команду:
do shell script "launchctl setenv variablename value"
(Використовуйте кілька рядків, якщо ви хочете встановити кілька змінних)
Тепер збережіть ( ⌘
+ s
) як формат файлу: додаток . Нарешті відкрийте System Settings
→ Користувачі та групи → Елементи входу та додайте нову заявку.
[ Оригінальна відповідь ]: щоб обійти навколо цього місця всі змінні, які ви хочете визначити у сценарії короткої оболонки, а потім ознайомтеся з цією попередньою відповіддю про те, як запустити скрипт під час входу в MacOS . Таким чином сценарій буде викликаний, коли користувач увійде в систему.
[ Редагувати ]: Жодне рішення не є ідеальним, оскільки змінні встановлюватимуться лише для цього конкретного користувача, але я сподіваюся, що це може бути все, що вам потрібно.
Якщо у вас є кілька користувачів, ви можете вручну встановити елемент входу для кожного з них або помістити копію com.user.loginscript.plist у кожну їх локальну бібліотеку / LaunchAgents каталог « , вказуючи на той самий скрипт оболонки.
Звичайно, жоден із цих обхідних шляхів не є таким зручним, як /etc/launchd.conf .
[ Далі редагувати ]: Користувач нижче згадує, що це не працює для нього. Однак я протестував на декількох машинах Yosemite, і це працює для мене. Якщо у вас є проблеми, пам’ятайте, що вам потрібно буде перезапустити програми, щоб це набуло чинності. Крім того, якщо ви встановите змінні в терміналі через ~ / .profile або ~ / .bash_profile , вони замінять речі, встановлені через startctl setenv для програм, запущених з оболонки .
Можна встановити змінні середовища на Mac OS X 10.10 Yosemite з 3 файлами + 2 команди.
Основний файл із визначенням змінних середовища:
$ ls -la /etc/environment
-r-xr-xr-x 1 root wheel 369 Oct 21 04:42 /etc/environment
$ cat /etc/environment
#!/bin/sh
set -e
syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start"
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv MAVEN_HOME /opt/local/share/java/maven3
if [ -x /usr/libexec/path_helper ]; then
export PATH=""
eval `/usr/libexec/path_helper -s`
launchctl setenv PATH $PATH
fi
osascript -e 'tell app "Dock" to quit'
syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete"
Визначення служби для завантаження змінних середовища для програм користувача (термінал, IDE, ...):
$ ls -la /Library/LaunchAgents/environment.user.plist
-rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist
$ sudo cat /Library/LaunchAgents/environment.user.plist
<?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>environment.user</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
Те саме визначення служби для програм root:
$ ls -la /Library/LaunchDaemons/environment.plist
-rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist
$ sudo cat /Library/LaunchDaemons/environment.plist
<?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>environment</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
І нарешті, нам слід зареєструвати ці послуги:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
Що ми отримуємо:
Проблеми / проблеми:
Для того, щоб ваші ENV змінні були правильно прийняті програмами після перезавантаження системи, вам знадобиться:
Це відбувається через те, що Apple заперечує чітке впорядкування завантажених сервісів, тому змінні env реєструються паралельно з обробкою "повторно відкритої черги".
Але насправді я перезавантажую систему лише кілька разів на рік (на великих оновленнях), тому це не велика справа.
JAVA_HOME
), але не для PATH
змінної (див. Моє запитання на запитання різних ).
launchd
, але чи не вдалося б завантажити цих демонів під час завантаження (тобто перед входом)? Це повинно обійти всі згадані вами проблеми.
Цитується з
Apple Developer Relations
10-Oct-2014 09:12 PM
Після багато роздумів, інженерія усунула цю особливість. Файл
/etc/launchd.conf
навмисно видалено з міркувань безпеки. Як вирішення, ви можете запуститиlaunchctl limit
як root на початку завантаження, можливо, з aLaunchDaemon
. (...)
Рішення:
Введіть код у
/Library/LaunchDaemons/com.apple.launchd.limit.plist
bash-script:
#!/bin/bash
echo '<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>core</string>
<string>unlimited</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist
/Library/LaunchDaemons
і замість того, launchctl
щоб казати виконувати limit
команду, скажіть йому, щоб запустити setenv
команду PATH
і рядок шляху як аргументи. launchd
слід підбирати його автоматично під час запуску та отримувати щось самомодифіковане майже негайно.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Ось команди відновити стару поведінку:
# create a script that calls launchctl iterating through /etc/launchd.conf
echo '#!/bin/sh
while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf;
' > /usr/local/bin/launchd.conf.sh
# make it executable
chmod +x /usr/local/bin/launchd.conf.sh
# launch the script at startup
echo '<?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>launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/usr/local/bin/launchd.conf.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist
Тепер ви можете вказати команди, як setenv JAVA_HOME /Library/Java/Home
у /etc/launchd.conf
.
Перевірено на Ель-Капітан.
Що для мене спрацювало (надихнувшись від дякової подяки):
Вставте це в /Library/LaunchDaemons/com.apple.launchd.limit.plist і перезавантажте:
<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>16384</string>
<string>16384</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
Якщо вам це потрібно, крок за кроком:
⌘+v
). Це призведе до обмеження до 16384 файлів за один процес та 16384 файлів усьогоesc
потім:wq
Я сподіваюся, що це вам допомогло.
Ви можете спробувати https://github.com/ersiner/osx-env-sync . Він обробляє і командний рядок, і програми GUI з одного джерела, і працює з останньою версією OS X (Yosemite).
Ви можете використовувати підстановку шляху та інші хитрощі оболонок, оскільки те, що ви пишете, - це звичайний скрипт bash, який в першу чергу повинен бути використаний bash. Ніяких обмежень .. (Перевірте документацію на osx-env-sync, і ви зрозумієте, як це досягти.)
Я відповів на подібне запитання тут, де ви знайдете більше.
Рішення полягає в тому, щоб додати свою змінну до /etc/profile
. Тоді все працює як очікувалося! Звичайно, ВИ ТАКОЙ СПОСІБНО це зробити як користувач root з sudo nano / etc / profile. Якщо ви редагуєте його будь-яким іншим способом, система скаржиться на пошкоджений / etc / profile, навіть якщо ви зміните дозволи на root.
Я додав змінні в ~ / .bash_profile наступним чином. Після завершення перезавантаження / виходу з системи та входу в систему
export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3
export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4
launchctl setenv M2_HOME $M2_HOME
launchctl setenv ANT_HOME $ANT_HOME
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin
launchctl setenv PATH $PATH
ПРИМІТКА: без перезапуску / виходу з системи та входу в систему ви можете застосувати ці зміни за допомогою;
source ~/.bash_profile