Похоже, что launchd.conf
больше не загружает мою переменную среды. Кто-нибудь еще заметил это?
Есть ли другое решение для постоянной установки переменных среды?
Похоже, что launchd.conf
больше не загружает мою переменную среды. Кто-нибудь еще заметил это?
Есть ли другое решение для постоянной установки переменных среды?
Создайте 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
, чтобы запустить его немедленно.
[Изменить]
То же решение работает и в El Capitan.
Xcode 7.0+ по умолчанию не оценивает переменные среды. Старое поведение можно включить с помощью этой команды:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Изменить]
Есть пара ситуаций, когда это не совсем работает. Если компьютер перезагружен и выбран параметр «Открывать окна при повторном входе в систему», повторно открытые окна могут не видеть переменные (возможно, они открываются до запуска агента). Кроме того, если вы войдете в систему через ssh, переменные не будут установлены (поэтому вам нужно будет установить их в ~ / .bash_profile). Наконец, похоже, это не работает для PATH на El Capitan и Sierra. Это необходимо установить с помощью «launchctl config user path ...» и в / etc / paths.
UseSanitizedBuildSystemEnvironment
).
- person Ohad Schneider; 20.10.2015
launchctl unload ~/Library/LaunchAgents/environment.plist
- Выполнить launchctl load ~/Library/LaunchAgents/environment.plist
- Выход Terminal
- Перезапустить Terminal
, и новая переменная среды должна быть доступна (вы можете перечислить все переменные с помощью printenv
) Примечание. Поскольку это XML, ваши переменные должны соответствовать правилам синтаксиса XML. Так, например, значение переменной не может содержать амперсанд (&).
- person asherbar; 22.09.2016
sudo launchctl config user path $PATH
работает на Мохаве
- person Ivan Romanov; 13.11.2018
[Исходный ответ]: вы по-прежнему можете использовать launchctl setenv variablename value
, чтобы задать переменную, которая будет использоваться всеми приложениями (графическими приложениями, запускаемыми через Dock или Spotlight, в дополнение к тем запустил через терминал).
Очевидно, вы не захотите делать это каждый раз при входе в систему.
[Изменить]: чтобы этого не произошло, запустите AppleScript Editor
, введите следующую команду:
do shell script "launchctl setenv variablename value"
(Используйте несколько строк, если вы хотите установить несколько переменных)
Теперь сохраните (_4 _ + _ 5_) как Формат файла: Приложение. Наконец, откройте System Settings
→ Пользователи и группы → Элементы входа и добавьте новое приложение.
[Исходный ответ]: чтобы обойти это место, все переменные, которые вы хотите определить в коротком сценарии оболочки, посмотрите на этот предыдущий ответ о том, как запустить сценарий при входе в MacOS. Таким образом, сценарий будет вызываться при входе пользователя в систему.
[Изменить]: Ни одно из решений не является идеальным, поскольку переменные будут установлены только для этого конкретного пользователя, но я надеюсь / предполагаю, что это может быть все, что вам нужно.
Если у вас несколько пользователей, вы можете вручную установить элемент входа для каждого из них или разместить копию com.user.loginscript.plist в каждом из их локальных < em> Library / LaunchAgents, указывая на тот же сценарий оболочки.
Конечно, ни один из этих обходных путей не так удобен, как /etc/launchd.conf.
[Дальнейшее редактирование]: пользователь ниже упоминает, что это не сработало для него. Однако я тестировал на нескольких машинах Yosemite, и у меня это работает. Если у вас возникла проблема, помните, что вам нужно будет перезапустить приложения, чтобы это вступило в силу. Кроме того, если вы устанавливаете переменные в терминале через ~ / .profile или ~ / .bash_profile, они переопределяют значения, установленные через launchctl setenv для < strong> приложения запускались из оболочки.
В 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
(см. мой вопрос в вопросе разные).
- person halloleo; 28.10.2014
launchd
, но нельзя ли загрузить эти демоны при загрузке (т.е. перед входом в систему)? Это должно обойти все проблемы, о которых вы упомянули.
- person Egon; 09.11.2014
.zshrc
. Я считаю это продолжением описанного выше подхода.
- person ; 12.07.2015
Цитируется из
Apple Developer Relations
10-Oct-2014 09:12 PM
После долгих раздумий инженеры удалили эту функцию. Файл
/etc/launchd.conf
был намеренно удален из соображений безопасности. В качестве обходного пути вы можете запуститьlaunchctl limit
как root на ранней стадии загрузки, возможно, изLaunchDaemon
. (...)
Решение:
Поместите код в
/Library/LaunchDaemons/com.apple.launchd.limit.plist
с помощью bash-скрипта:
#!/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
должен автоматически загрузиться при запуске и почти сразу же стать как бы самоизменяющимся.
- person Laird Nelson; 17.10.2014
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
.
- person UloPe; 20.10.2014
Вот команды для восстановления старого поведения:
# 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
.
Проверил на Эль-Капитане.
Что сработало для меня (вдохновлено благодарностью aax):
Вставьте это в /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 попытка. Он обрабатывает приложения как командной строки, так и графического интерфейса из единого источника и работает с последней версией 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