Odpowiedzi:
Utwórz environment.plist
plik w ~/Library/LaunchAgents/
tej treści:
<?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>
Możesz dodać wiele launchctl
poleceń wewnątrz <string></string>
bloku.
plist
Uaktywni po ponownym uruchomieniu systemu. Możesz także użyć launchctl load ~/Library/LaunchAgents/environment.plist
go do natychmiastowego uruchomienia.
[Edytować]
To samo rozwiązanie działa również w El Capitan.
Xcode 7.0+ domyślnie nie ocenia zmiennych środowiskowych. Stare zachowanie można włączyć za pomocą tego polecenia:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Edytować]
Jest kilka sytuacji, w których to nie do końca działa. Jeśli komputer zostanie zrestartowany i zostanie wybrana opcja „Ponownie otwórz okna podczas ponownego logowania”, ponownie otwarte okna mogą nie widzieć zmiennych (być może są one otwarte przed uruchomieniem agenta). Ponadto, jeśli zalogujesz się przez ssh, zmienne nie zostaną ustawione (więc musisz ustawić je w ~ / .bash_profile). Wreszcie, wydaje się, że nie działa to w przypadku PATH w El Capitan i Sierra. Należy to ustawić za pomocą „ścieżka użytkownika config Launctl ...” oraz w / etc / paths.
UseSanitizedBuildSystemEnvironment
).
[ Oryginalna odpowiedź ]: Nadal można użyć launchctl setenv variablename value
do ustawienia zmiennej, która będzie pobierana przez wszystkie aplikacje (aplikacje graficzne uruchamiane przez Dock lub Spotlight, oprócz tych uruchamianych przez terminal).
Oczywiście nie będziesz chciał tego robić przy każdym logowaniu.
[ Edytuj ]: Aby tego uniknąć, uruchom AppleScript Editor
, wprowadź polecenie takie jak to:
do shell script "launchctl setenv variablename value"
(Użyj wielu linii, jeśli chcesz ustawić wiele zmiennych)
Teraz zapisz ( ⌘
+ s
) jako Format pliku: Aplikacja . Na koniec otwórz System Settings
→ Użytkownicy i grupy → Zaloguj się i dodaj nową aplikację.
[ Oryginalna odpowiedź ]: Aby obejść to miejsce, wszystkie zmienne, które chcesz zdefiniować w skrypcie krótkiej powłoki, zapoznaj się z poprzednią odpowiedzią na temat uruchamiania skryptu przy logowaniu do MacOS . W ten sposób skrypt zostanie wywołany, gdy użytkownik się zaloguje.
[ Edytuj ]: Żadne z tych rozwiązań nie jest idealne, ponieważ zmienne zostaną ustawione tylko dla tego konkretnego użytkownika, ale mam nadzieję / zgaduję, że może być wszystkim, czego potrzebujesz.
Jeśli masz wielu użytkowników, możesz ręcznie ustawić element logowania dla każdego z nich lub umieścić kopię com.user.loginscript.plist w każdym z lokalnych katalogów Library / LaunchAgents , wskazując ten sam skrypt powłoki.
Oczywiście żadne z tych obejść nie jest tak wygodne jak /etc/launchd.conf .
[ Dalsza edycja ]: Użytkownik poniżej wspomina, że to nie działało dla niego. Jednak przetestowałem na wielu maszynach Yosemite i to działa dla mnie. Jeśli masz problem, pamiętaj, że musisz ponownie uruchomić aplikacje, aby to zadziałało. Dodatkowo, jeśli ustawisz zmienne w terminalu za pomocą ~ / .profile lub ~ / .bash_profile , zastąpią one rzeczy ustawione przez launchctl setenv dla aplikacji uruchamianych z powłoki .
Możliwe jest ustawienie zmiennych środowiskowych w systemie Mac OS X 10.10 Yosemite za pomocą 3 plików + 2 poleceń.
Plik główny z definicją zmiennych środowiskowych:
$ 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"
Definicja usługi do ładowania zmiennych środowiskowych dla aplikacji użytkownika (terminal, 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>
Ta sama definicja usługi dla aplikacji użytkownika 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>
I na koniec powinniśmy zarejestrować te usługi:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
Co otrzymujemy:
Problemy / problemy:
Aby zmienne env zostały poprawnie pobrane przez aplikacje po ponownym uruchomieniu systemu , będziesz potrzebować:
Dzieje się tak, ponieważ Apple zaprzecza wyraźnemu porządkowaniu załadowanych usług, dlatego zmienne env są rejestrowane równolegle z przetwarzaniem „kolejki ponownego otwarcia”.
Ale w rzeczywistości restartuję system tylko kilka razy w roku (w przypadku dużych aktualizacji), więc nie jest to wielka sprawa.
JAVA_HOME
), ale nie dla PATH
zmiennej (patrz moje pytanie na pytanie inaczej ).
launchd
, ale czy nie byłoby możliwe załadowanie tych demonów przy rozruchu (tj. Przed zalogowaniem)? To powinno obejść wszystkie wymienione przez Ciebie problemy.
Cytowano z
Apple Developer Relations
10-Oct-2014 09:12 PM
Po wielu rozważaniach inżynierowie usunęli tę funkcję. Plik
/etc/launchd.conf
został celowo usunięty ze względów bezpieczeństwa. Aby obejść ten problem, możesz uruchamiać sięlaunchctl limit
jako root na początku rozruchu, być może zLaunchDaemon
. (...)
Rozwiązanie:
Wpisz kod w
/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
i zamiast mówić launchctl
polecenie uruchomienia limit
polecenia, powiedz mu, aby uruchomiło setenv
polecenie PATH
i ciąg ścieżki jako argumenty. launchd
powinien podnieść go automatycznie przy starcie i niemal natychmiast dokonać automatycznej modyfikacji.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Oto polecenia przywracające stare zachowanie:
# 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
Teraz możesz określić polecenia takie jak setenv JAVA_HOME /Library/Java/Home
w /etc/launchd.conf
.
Sprawdzone na El Capitan.
Co zadziałało dla mnie (zainspirowane podziękowaniami aax):
Wklej to do /Library/LaunchDaemons/com.apple.launchd.limit.plist, a następnie uruchom ponownie:
<?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>
Jeśli potrzebujesz tego krok po kroku:
⌘+v
). Wymusi to ograniczenie do 16384 plików na proces i 16384 plików ogółemesc
następnie:wq
Mam nadzieję, że to ci pomogło.
Możesz spróbować https://github.com/ersiner/osx-env-sync . Obsługuje aplikacje wiersza polecenia i GUI z jednego źródła i działa z najnowszą wersją systemu OS X (Yosemite).
Możesz używać podstawiania ścieżek i innych sztuczek powłoki, ponieważ to, co piszesz, to zwykły skrypt bash, który w pierwszej kolejności jest pozyskiwany przez bash. Bez ograniczeń .. (Sprawdź dokumentację osx-env-sync, a zrozumiesz, jak to osiągnąć).
Odpowiedziałem na podobne pytanie tutaj, gdzie znajdziesz więcej.
Rozwiązaniem jest dodanie zmiennej /etc/profile
. Wtedy wszystko działa zgodnie z oczekiwaniami! Oczywiście MUSISZ to zrobić jako użytkownik root z sudo nano / etc / profile. Jeśli edytujesz go w jakikolwiek inny sposób, system będzie narzekał na uszkodzony profil / etc /, nawet jeśli zmienisz uprawnienia do rootowania.
Dodałem zmienne do ~ / .bash_profile w następujący sposób. Po zakończeniu uruchom ponownie / wyloguj się i zaloguj
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
UWAGA: bez ponownego uruchomienia / wylogowania i zalogowania można zastosować te zmiany za pomocą;
source ~/.bash_profile