Risposte:
Crea un environment.plist
file ~/Library/LaunchAgents/
con questo contenuto:
<?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>
Puoi aggiungere molti launchctl
comandi all'interno del <string></string>
blocco.
Si plist
attiverà dopo il riavvio del sistema. Puoi anche usarlo launchctl load ~/Library/LaunchAgents/environment.plist
per avviarlo immediatamente.
[Modificare]
La stessa soluzione funziona anche a El Capitan.
Xcode 7.0+ non valuta le variabili di ambiente per impostazione predefinita. Il vecchio comportamento può essere abilitato con questo comando:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Modificare]
Ci sono un paio di situazioni in cui questo non funziona del tutto. Se il computer viene riavviato e viene selezionata l'opzione "Riapri finestre quando si riconnette", le finestre riaperte potrebbero non visualizzare le variabili (forse vengono aperte prima dell'esecuzione dell'agente). Inoltre, se accedi tramite ssh, le variabili non verranno impostate (quindi dovrai impostarle in ~ / .bash_profile). Infine, questo non sembra funzionare per PATH su El Capitan e Sierra. Questo deve essere impostato tramite 'launchctl config user path ...' e in / etc / percorsi.
UseSanitizedBuildSystemEnvironment
).
[ Risposta originale ]: è ancora possibile utilizzare launchctl setenv variablename value
per impostare una variabile in modo che venga rilevata da tutte le applicazioni (applicazioni grafiche avviate tramite Dock o Spotlight, oltre a quelle avviate tramite il terminale).
Ovviamente non vorrai farlo ogni volta che accedi.
[ Modifica ]: per evitarlo, avvia AppleScript Editor
, inserisci un comando come questo:
do shell script "launchctl setenv variablename value"
(Utilizzare più righe se si desidera impostare più variabili)
Ora salva ( ⌘
+ s
) come Formato file: Applicazione . Infine apri System Settings
→ Utenti e gruppi → Elementi di accesso e aggiungi la tua nuova applicazione.
[ Risposta originale ]: per aggirare questo posto tutte le variabili che si desidera definire in uno script di shell corta, quindi dare un'occhiata a questa risposta precedente su come eseguire uno script con l'accesso a MacOS . In questo modo lo script verrà invocato quando l'utente accede.
[ Modifica ]: nessuna delle due soluzioni è perfetta in quanto le variabili verranno impostate solo per quell'utente specifico, ma spero / indovino che potrebbe essere tutto ciò di cui hai bisogno.
Se si dispone di più utenti, è possibile impostare manualmente un elemento di accesso per ciascuno di essi oppure posizionare una copia di com.user.loginscript.plist in ciascuna delle directory Library / LaunchAgents locali , puntando allo stesso script shell.
Concesso, nessuna di queste soluzioni alternative è conveniente come /etc/launchd.conf .
[ Ulteriore modifica ]: un utente di seguito menziona che questo non ha funzionato per lui. Tuttavia, ho testato su più macchine Yosemite e funziona per me. Se si riscontra un problema, ricordare che sarà necessario riavviare le applicazioni affinché ciò abbia effetto. Inoltre, se si impostano le variabili nel terminale tramite ~ / .profile o ~ / .bash_profile , sovrascriveranno le cose impostate tramite launchctl setenv per le applicazioni avviate dalla shell .
È possibile impostare variabili di ambiente su Mac OS X 10.10 Yosemite con 3 file + 2 comandi.
File principale con definizione delle variabili di ambiente:
$ 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"
Definizione del servizio per caricare le variabili di ambiente per le applicazioni utente (terminale, 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>
La stessa definizione di servizio per le applicazioni utente 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>
E infine dovremmo registrare questi servizi:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
Cosa otteniamo:
Problemi / problemi:
Per far sì che le variabili env siano state prese correttamente dalle applicazioni dopo il riavvio del sistema , sarà necessario:
Ciò accade perché Apple nega l'ordinamento esplicito dei servizi caricati, quindi le variabili env vengono registrate parallelamente all'elaborazione della "coda di riapertura".
Ma in realtà, riavvio il mio sistema solo più volte all'anno (su grandi aggiornamenti), quindi non è un grosso problema.
JAVA_HOME
), ma non per la PATH
variabile (vedi la mia domanda su chiedere diverso ).
launchd
, ma non sarebbe possibile caricare quei demoni all'avvio (cioè prima dell'accesso)? Ciò dovrebbe eludere tutte le questioni che menzioni.
Citato da
Apple Developer Relations
10-Oct-2014 09:12 PM
Dopo molte discussioni, l'ingegneria ha rimosso questa funzione. Il file è
/etc/launchd.conf
stato rimosso intenzionalmente per motivi di sicurezza. Per ovviare al problema, è possibile eseguirelaunchctl limit
come root all'inizio durante l'avvio, forse da aLaunchDaemon
. (...)
Soluzione:
Inserisci il codice in
/Library/LaunchDaemons/com.apple.launchd.limit.plist
da 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
e, invece di dire launchctl
di eseguire il limit
comando, digli di eseguire il setenv
comando con PATH
una stringa di percorso come argomenti. launchd
dovrebbe prenderlo automaticamente all'avvio e ottenere una sorta di auto-modifica quasi immediatamente.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Ecco i comandi per ripristinare il vecchio comportamento:
# 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
Ora puoi specificare comandi come setenv JAVA_HOME /Library/Java/Home
in /etc/launchd.conf
.
Controllato su El Capitan.
Cosa ha funzionato per me (ispirato dai ringraziamenti di aax):
Incollalo in /Library/LaunchDaemons/com.apple.launchd.limit.plist quindi riavvia:
<?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>
Se ne hai bisogno passo dopo passo:
⌘+v
). Ciò imporrà il limite a 16384 file per processo e 16384 file totaliesc
quindi:wq
Spero che questo ti abbia aiutato.
Puoi provare https://github.com/ersiner/osx-env-sync . Gestisce entrambe le app della riga di comando e della GUI da un'unica fonte e funziona con l' ultima versione di OS X (Yosemite).
È possibile utilizzare le sostituzioni di percorso e altri trucchi della shell poiché ciò che si scrive è un normale script bash che deve essere originariamente fornito da bash. Nessuna restrizione .. (Controlla la documentazione di osx-env-sync e capirai come ci riesce.)
Ho risposto a una domanda simile qui dove troverai di più.
La soluzione è aggiungere la tua variabile a /etc/profile
. Quindi tutto funziona come previsto! Ovviamente DEVI farlo come utente root con sudo nano / etc / profile. Se lo modifichi in qualsiasi altro modo il sistema si lamenterà di un profilo / etc / danneggiato, anche se cambi i permessi in root.
Ho aggiunto le variabili nel ~ / .bash_profile nel modo seguente. Al termine, riavviare / disconnettersi e accedere
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
NOTA: senza riavviare / disconnettersi e accedere è possibile applicare queste modifiche utilizzando;
source ~/.bash_profile