Es sieht aus wie das launchd.conf
lädt meine Umgebungsvariable nicht mehr. Hat das noch jemand bemerkt?
Gibt es eine andere Lösung, um Umgebungsvariablen dauerhaft festzulegen?
Erstellen Sie eine environment.plist
- Datei in ~/Library/LaunchAgents/
Mit folgendem 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 viele launchctl
Befehle innerhalb des <string></string>
Blocks hinzufügen.
Das plist
wird nach dem Neustart des Systems aktiviert. Sie können es auch mit launchctl load ~/Library/LaunchAgents/environment.plist
Sofort starten.
[Bearbeiten]
Die gleiche Lösung funktioniert auch in El Capitan.
Xcode 7.0+ wertet standardmäßig keine Umgebungsvariablen 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 möglicherweise nicht in den neu geöffneten Fenstern 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 bei PATH auf El Capitan und Sierra nicht zu funktionieren. Dies muss über 'launchctl config user path ...' und in/etc/arrows eingestellt werden.
[ Ursprüngliche Antwort ]: Sie können immer noch launchctl setenv variablename value
, um eine Variable festzulegen, die von allen Anwendungen (grafische Anwendungen, die über Dock oder Spotlight gestartet wurden, zusätzlich zu denen, die über das Terminal gestartet wurden) aufgenommen wird ).
Natürlich möchten Sie dies nicht jedes Mal tun, wenn Sie sich anmelden.
[ Bearbeiten ]: Um dies zu vermeiden, starten Sie AppleScript Editor
, gib einen Befehl wie diesen ein:
do Shell script "launchctl setenv variablename value"
(Verwenden Sie mehrere Zeilen, wenn Sie mehrere Variablen festlegen möchten.)
Nun speichere (⌘
+ s
) as Dateiformat: Anwendung. Endlich offen System Settings
→ Benutzer & Gruppen → Anmeldeobjekte und fügen Sie Ihre neue Anwendung hinzu.
[ Ursprüngliche Antwort ]: Um dieses Problem zu umgehen, platzieren Sie alle Variablen, die Sie definieren möchten, in einem kurzen Shell-Skript. Schauen Sie sich dann Folgendes an: vorherige Antwort zum Ausführen eines Skripts unter MacOS login . 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 spezifischen Benutzer festgelegt werden, aber ich hoffe Ich schätze, das ist alles, was du brauchst.
Wenn Sie mehrere Benutzer haben, können Sie entweder manuell Login Item für jeden von ihnen festlegen oder eine Kopie von com.user.loginscript.plist in jeden von ihnen einfügen der lokalen Library/LaunchAgents Verzeichnisse, die auf dasselbe Shell-Skript verweisen.
Zugegeben, keine dieser Problemumgehungen ist so praktisch wie /etc/launchd.conf.
[ Further Edit ]: Ein Benutzer unten erwähnt, dass dies für ihn nicht funktioniert hat. Ich habe jedoch auf mehreren Yosemite-Maschinen 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 zusätzlich Variablen im Terminal über ~/.profile oder ~/.bash_profile setzen, überschreiben sie die über launchctl setenv 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>
nd zum Schluss 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:
Damit Ihre Umgebungsvariablen von Anwendungen korrekt übernommen wurden nach dem Neustart des Systems benötigen Sie:
Dies ist darauf zurückzuführen, dass Apple die explizite Bestellung geladener Dienste verweigert, sodass Umgebungsvariablen parallel zur Verarbeitung der "Wiedereröffnungswarteschlange" registriert werden.
Tatsächlich starte ich mein System jedoch nur mehrmals im Jahr neu (bei großen Aktualisierungen), sodass es keine große Sache ist.
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ühzeitig während des Startvorgangs als root ausführen, möglicherweise von einemLaunchDaemon
aus. (...)
Lösung:
Fügen Sie den Code per Bash-Skript in
/Library/LaunchDaemons/com.Apple.launchd.limit.plist
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
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
im /etc/launchd.conf
.
Überprüft auf El Capitan.
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 dann 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
). Dadurch wird die Beschränkung auf 16384 Dateien pro Prozess und 16384 Dateien insgesamt erzwungenesc
und 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 einzigen Quelle und funktioniert mit der neuesten Version von OS X (Yosemite).
Sie können Pfadsubstitutionen und andere Shell-Tricks verwenden, da das, was Sie schreiben, ein reguläres Bash-Skript ist, das zuerst von Bash bezogen wird. Keine Einschränkungen. (Lesen Sie osx-env-sync Dokumentation und Sie werden verstehen, wie dies erreicht wird.)
Ich habe eine ähnliche Frage beantwortet hier wo Sie mehr finden.