Antworten:
Erstellen Sie eine environment.plist
Datei ~/Library/LaunchAgents/
mit diesem Inhalt:
<?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>
Sie können launchctl
dem <string></string>
Block viele Befehle hinzufügen .
Das plist
wird nach dem Neustart des Systems aktiviert. Sie können es auch verwenden launchctl load ~/Library/LaunchAgents/environment.plist
, um es sofort zu starten.
[Bearbeiten]
Die gleiche Lösung funktioniert auch in El Capitan.
Xcode 7.0+ wertet Umgebungsvariablen standardmäßig nicht aus. Das alte Verhalten kann mit diesem Befehl aktiviert werden:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Bearbeiten]
Es gibt einige Situationen, in denen dies nicht ganz funktioniert. Wenn der Computer neu gestartet wird und "Fenster beim erneuten Anmelden erneut öffnen" ausgewählt ist, werden die Variablen in den erneut geöffneten Fenstern möglicherweise nicht angezeigt (möglicherweise werden sie geöffnet, bevor der Agent ausgeführt wird). Wenn Sie sich über ssh anmelden, werden die Variablen nicht festgelegt (Sie müssen sie daher in ~ / .bash_profile festlegen). Schließlich scheint dies für PATH auf El Capitan und Sierra nicht zu funktionieren. Dies muss über 'launchctl config user path ...' und in / etc / path eingestellt werden.
UseSanitizedBuildSystemEnvironment
) genau neunmal angezeigt wird .
[ Ursprüngliche Antwort ]: Sie können weiterhin launchctl setenv variablename value
eine Variable festlegen, die von allen Anwendungen erfasst wird (grafische Anwendungen, die über das Dock oder Spotlight gestartet wurden, zusätzlich zu denen, die über das Terminal gestartet wurden).
Natürlich möchten Sie dies nicht jedes Mal tun, wenn Sie sich anmelden.
[ Bearbeiten ]: Um dies zu vermeiden, starten Sie AppleScript Editor
und geben Sie einen Befehl wie den folgenden ein:
do shell script "launchctl setenv variablename value"
(Verwenden Sie mehrere Zeilen, wenn Sie mehrere Variablen festlegen möchten.)
Speichern Sie nun ( ⌘
+ s
) als Dateiformat: Anwendung . Öffnen Sie abschließendSystem Settings
→ Benutzer & Gruppen → Anmeldeelemente und fügen Sie Ihre neue Anwendung hinzu.
[ Ursprüngliche Antwort ]: Um diesen Ort zu umgehen, platzieren Sie alle Variablen, die Sie in einem kurzen Shell-Skript definieren möchten. Schauen Sie sich dann diese vorherige Antwort an, wie Sie ein Skript unter MacOS-Login ausführen . Auf diese Weise wird das Skript aufgerufen, wenn sich der Benutzer anmeldet.
[ Bearbeiten ]: Keine der beiden Lösungen ist perfekt, da die Variablen nur für diesen bestimmten Benutzer festgelegt werden, aber ich hoffe / vermute, dass dies alles ist, was Sie benötigen.
Wenn Sie mehrere Benutzer haben, können Sie entweder manuell ein Anmeldeelement für jeden von ihnen festlegen oder eine Kopie von com.user.loginscript.plist in jeder ihrer lokalen Bibliotheken / LaunchAgents ablegen Verzeichnisse und auf dasselbe Shell-Skript verweisen.
Zugegeben, keine dieser Problemumgehungen ist so praktisch wie /etc/launchd.conf .
[ Weitere Bearbeitung ]: Ein Benutzer unten erwähnt, dass dies bei ihm nicht funktioniert hat. Ich habe jedoch auf mehreren Yosemite-Computern getestet und es funktioniert für mich. Wenn Sie ein Problem haben, denken Sie daran, dass Sie Anwendungen neu starten müssen, damit dies wirksam wird. Wenn Sie Variablen im Terminal über ~ / .profile oder ~ / .bash_profile festlegen , überschreiben sie außerdem die über launchctl setenv festgelegten Elemente für Anwendungen, die über die Shell gestartet wurden .
Unter Mac OS X 10.10 Yosemite können Umgebungsvariablen mit 3 Dateien + 2 Befehlen festgelegt werden.
Hauptdatei mit Definition der Umgebungsvariablen:
$ 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"
Dienstdefinition zum Laden von Umgebungsvariablen für Benutzeranwendungen (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>
Dieselbe Dienstdefinition für Root-Benutzeranwendungen:
$ 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>
Und schließlich sollten wir diese Dienste registrieren:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
Was wir bekommen:
Probleme / Probleme:
Damit Ihre env-Variablen nach dem Neustart des Systems von den Anwendungen korrekt übernommen wurden, benötigen Sie:
Dies liegt daran, dass Apple die explizite Bestellung geladener Dienste verweigert, sodass env-Variablen parallel zur Verarbeitung der "Wiedereröffnungswarteschlange" registriert werden.
Tatsächlich starte ich mein System jedoch nur mehrmals pro Jahr neu (bei großen Updates), es ist also keine große Sache.
JAVA_HOME
), aber nicht für die PATH
Variable (siehe meine Frage auf anders stellen ).
launchd
, aber wäre es nicht möglich, diese Daemons beim Booten (dh vor dem Anmelden) zu laden? Das sollte alle von Ihnen erwähnten Probleme umgehen.
Zitiert von
Apple Developer Relations
10-Oct-2014 09:12 PM
Nach langem Überlegen hat das Engineering diese Funktion entfernt. Die Datei
/etc/launchd.conf
wurde aus Sicherheitsgründen absichtlich entfernt. Um dieses Problem zu umgehen, können Sielaunchctl limit
früh während des Startvorgangs als Root ausgeführt werden, möglicherweise von aLaunchDaemon
. (...)
Lösung:
Fügen Sie Code
/Library/LaunchDaemons/com.apple.launchd.limit.plist
per Bash-Skript ein:
#!/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
, und anstatt zu sagen launchctl
, dass der limit
Befehl ausgeführt werden soll, weisen Sie ihn an, den setenv
Befehl mit PATH
und einer Pfadzeichenfolge als Argumente auszuführen . launchd
sollte es beim Start automatisch abholen und sich fast sofort selbst modifizieren.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Hier sind die Befehle zum Wiederherstellen des alten Verhaltens:
# 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
Jetzt können Sie Befehle wie setenv JAVA_HOME /Library/Java/Home
in angeben /etc/launchd.conf
.
Auf El Capitan überprüft.
Was hat bei mir funktioniert (inspiriert von Aax 'Dank):
Fügen Sie dies in /Library/LaunchDaemons/com.apple.launchd.limit.plist ein und starten Sie es neu:
<?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>
Wenn Sie es Schritt für Schritt brauchen:
⌘+v
) ein. Dadurch wird das Limit auf 16384 Dateien pro Prozess und insgesamt 16384 Dateien erzwungenesc
dann:wq
Ich hoffe das hat dir geholfen.
Sie können https://github.com/ersiner/osx-env-sync ausprobieren. Es verarbeitet sowohl Befehlszeilen- als auch GUI-Apps aus einer Hand und funktioniert mit der neuesten Version von OS X (Yosemite).
Sie können Pfadsubstitutionen und andere Shell-Tricks verwenden, da Sie ein reguläres Bash-Skript schreiben, das in erster Linie von Bash bezogen wird. Keine Einschränkungen. (Überprüfen Sie die Dokumentation zu osx-env-sync und Sie werden verstehen, wie dies erreicht wird.)
Ich habe hier eine ähnliche Frage beantwortet , wo Sie mehr finden.
Die Lösung besteht darin, Ihre Variable hinzuzufügen /etc/profile
. Dann funktioniert alles wie erwartet! Natürlich MÜSSEN Sie dies als Root-Benutzer mit sudo nano / etc / profile tun. Wenn Sie es auf andere Weise bearbeiten, beschwert sich das System mit einem beschädigten / etc / profile, selbst wenn Sie die Berechtigungen in root ändern.
Ich habe die Variablen im ~ / .bash_profile folgendermaßen hinzugefügt. Nachdem Sie fertig sind, starten Sie neu / melden Sie sich ab und melden Sie sich an
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
HINWEIS: Ohne Neustart / Abmelden und Anmelden können Sie diese Änderungen mit anwenden.
source ~/.bash_profile