Изглежда, че 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
работи за Mojave
- person Ivan Romanov; 13.11.2018
[Оригинален отговор]: Все още можете да използвате launchctl setenv variablename value
, за да зададете променлива, така че да се приема от всички приложения (графични приложения, стартирани чрез Dock или Spotlight, в допълнение към тези стартирани през терминала).
Очевидно няма да искате да правите това всеки път, когато влизате.
[Редактиране]: За да избегнете това, стартирайте AppleScript Editor
, въведете команда като тази:
do shell script "launchctl setenv variablename value"
(Използвайте няколко реда, ако искате да зададете множество променливи)
Сега запазете (⌘
+s
) като Файлов формат: Приложение. Накрая отворете System Settings
→ Потребители и групи → Елементи за влизане и добавете вашето ново приложение.
[Оригинален отговор]: За да заобиколите това място, всички променливи, които искате да дефинирате в кратък шел скрипт, след това погледнете това предишен отговор за това как да стартирате скрипт при влизане в MacOS. По този начин скриптът ще бъде извикан, когато потребителят влезе.
[Редактиране]: Нито едно от решенията не е перфектно, тъй като променливите ще бъдат зададени само за този конкретен потребител, но се надявам/предполагам, че това може да е всичко, от което се нуждаете.
Ако имате няколко потребители, можете ръчно да зададете Елемент за влизане за всеки от тях или да поставите копие на com.user.loginscript.plist във всеки от техните локални < em>Library/LaunchAgents директории, сочещи към един и същ скрипт на обвивката.
Разбира се, нито едно от тези решения не е толкова удобно, колкото /etc/launchd.conf.
[Допълнителна редакция]: Потребител по-долу споменава, че това не е проработило за него. Въпреки това тествах на множество машини Yosemite и работи за мен. Ако имате проблем, не забравяйте, че ще трябва да рестартирате приложенията, за да влезе в сила това. Освен това, ако зададете променливи в терминала чрез ~/.profile или ~/.bash_profile, те ще заменят нещата, зададени чрез launchctl 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
(вижте моя въпрос при запитване различни).
- person halloleo; 28.10.2014
launchd
, но не би ли било възможно да заредите тези Daemons при зареждане (т.е. преди влизане)? Това трябва да заобиколи всички проблеми, които споменавате.
- 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
.
Проверено в El Capitan.
Какво свърши работа за мен (вдъхновен от благодарностите на 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 опит. Той обработва както командния ред, така и 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