Variabili d'ambiente in Mac OS X


186

Aggiornamento: il link seguente non ha una risposta completa . Dover impostare il percorso o la variabile in due punti (uno per la GUI e uno per la shell) è zoppo.

Non duplicato di : impostazione delle variabili di ambiente in OS X?


Proveniente da uno sfondo Windows in cui è molto facile impostare e modificare le variabili di ambiente (basta andare su Proprietà del sistema> Avanzate> Variabili d'ambiente), non sembra essere così semplice su Mac OS 10.5. La maggior parte dei riferimenti dice che dovrei aggiornare / etc / profile o ~ / .profile. Quelli sono l'equivalente di variabili di sistema e variabili utente? Ad esempio, dove devo impostare la mia JAVA_HOMEvariabile?


MODIFICARE:

Voglio poter accedere alla variabile dal terminale e ad un'app come Eclipse. Inoltre, spero di non dover riavviare / disconnettersi per rendere questo effetto.


E ci sono alcuni consigli nelle risposte alla domanda sul link non ripetute qui ...
dmckee --- ex-moderatore gattino

Risposte:


142

Non è necessario duplicare. È possibile impostare le variabili di ambiente utilizzate da launchd (e dai processi figlio, ovvero qualsiasi cosa si inizi da Spotlight) utilizzando launchctl setenv.

Ad esempio, se si desidera eseguire il mirroring del percorso corrente in launchd dopo averlo impostato in .bashrco ovunque:

PATH=whatever:you:want
launchctl setenv PATH $PATH

Le variabili di ambiente non vengono aggiornate automaticamente nelle applicazioni in esecuzione. Dovrai riavviare le applicazioni per ottenere le variabili di ambiente aggiornate (anche se puoi semplicemente impostare le variabili nella tua shell, ad esempio PATH=whatever:you:want; non è necessario riavviare il terminale).


1
Sembra la risposta migliore finora, non c'è bisogno di un'app di terze parti!
Abdullah Jibaly,

2
Questo non sembra essere globale: le variabili di ambiente impostate in questo modo sono locali per l'utente. Non abbiamo ancora un meccanismo globale per impostare una variabile d'ambiente.
Andrew,

@Andrew Cosa vuoi dire, locale per l'utente? Mi aspetto che tutti i processi successivamente avviati dal launchd siano interessati.
Matt Curtis,

@MattCurtis: le variabili di ambiente impostate tramite launchctl setenvsembrano essere visibili solo all'utente che apporta la modifica. Se imposto una variabile come utente normale, non è visibile su root (via sudo) e viceversa.
Andrew,

2
@Andrew OK, root ha il suo launchd - ps aux | grep launchdlo mostrerà. Controlla anche man sudoquali documenti che sudo(per impostazione predefinita) ripristinano deliberatamente l'ambiente, se sudo -Epreserverai l'ambiente (incluse le variabili con cui hai impostato launchctl setenv). A proposito, hai una domanda per questo? In tal caso, questo metodo funziona per te?
Matt Curtis,

299

Esistono diversi luoghi in cui è possibile impostare variabili di ambiente.

  • ~/.profile: usalo per le variabili che vuoi impostare in tutti i programmi lanciati dal terminale (nota che, a differenza di Linux, tutte le shell aperte in Terminal.app sono shell di login).
  • ~/.bashrc: viene invocato per le shell che non sono shell di login. Usalo per gli alias e altre cose che devono essere ridefiniti nei sottotitoli, non per le variabili di ambiente ereditate.
  • /etc/profile: questo viene caricato prima di ~ / .profile, ma è altrimenti equivalente. Usalo quando vuoi che la variabile si applichi ai programmi terminali lanciati da tutti gli utenti sulla macchina (supponendo che usino bash).
  • ~/.MacOSX/environment.plist: viene letto da loginwindow al login. Si applica a tutte le applicazioni, comprese quelle della GUI, ad eccezione di quelle avviate da Spotlight in 10.5 (non 10.6). È necessario disconnettersi e accedere nuovamente per rendere effettive le modifiche. Questo file non è più supportato da OS X 10.8.
  • launchdistanza del tuo utente : questo vale per tutti i programmi lanciati dall'utente, dalla GUI e dalla CLI. Puoi applicare le modifiche in qualsiasi momento utilizzando il setenvcomando in launchctl. In teoria , dovresti essere in grado di inserire setenvcomandi ~/.launchd.confe launchdleggerli automaticamente quando l'utente accede, ma in pratica il supporto per questo file non è mai stato implementato. Al contrario, è possibile utilizzare un altro meccanismo per eseguire uno script all'accesso e far richiamare tale script launchctlper configurare l' launchdambiente.
  • /etc/launchd.conf: viene letto da launchd all'avvio del sistema e quando un utente accede. Interessano ogni singolo processo sul sistema, poiché launchd è il processo principale. Per applicare le modifiche all'avvio root in esecuzione è possibile reindirizzare i comandi sudo launchctl.

Le cose fondamentali da capire sono:

  • le variabili di ambiente sono ereditate dai figli di un processo nel momento in cui vengono biforcate.
  • il processo di root è un'istanza launchd e esiste anche un'istanza launchd separata per sessione utente.
  • launchd ti permette di cambiare le sue attuali variabili d'ambiente usando launchctl; le variabili aggiornate vengono quindi ereditate da tutti i nuovi processi che inoltra da quel momento in poi.

Esempio di impostazione di una variabile di ambiente con launchd:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Ora avvia la tua app GUI che utilizza la variabile e voilà!

Per aggirare il fatto che ~/.launchd.confnon funziona, è possibile inserire il seguente script ~/Library/LaunchAgents/local.launchd.conf.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>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Quindi puoi metterlo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEall'interno ~/.launchd.confe verrà eseguito ad ogni accesso.

Si noti che, quando si esegue il piping di un elenco di comandi in launchctl in questo modo, non sarà possibile impostare variabili di ambiente con valori contenenti spazi. Se avete bisogno di farlo, è possibile chiamare launchctl come segue: launchctl setenv MYVARIABLE "QUOTE THE STRING".

Inoltre, si noti che altri programmi eseguiti al momento dell'accesso potrebbero essere eseguiti prima del launchagent e quindi potrebbero non vedere le variabili di ambiente impostate.


3
In realtà, per quanto riguarda ~/.MacOSX/environment.plist, sul mio Lion viene letto e utilizzato. L'ho appena provato. In realtà lo preferisco a .launchd.conf perché utilizzo il riquadro delle preferenze di RCenvironment per mantenerlo.
Gilimanjaro,

5
Non riesco ~/.launchd.confa lavorare su 10.6.8 - non sembra avere alcun effetto. Anche la pagina man dice che questo file non è attualmente supportato.
snowcrash09

4
~ / .launchd.conf non sembra funzionare nemmeno su 10.7.3 e quando guardo nella pagina man dice $ HOME / .launchd.conf Il tuo file di configurazione di launchd (attualmente non supportato)
creativo

4
In 10.8 (Mountain Lion), ~ / .MacOSX / environment.plist non è più supportato. Secondo Apple Dev, è necessario "Modificare il file Info.plist dello stesso .app per contenere un dizionario" LSEnvironment "con le variabili di ambiente desiderate." Per ulteriori informazioni, consultare apple.stackexchange.com/questions/57385/…
pnkfelix,

3
@LaC Ottimo post completo; potresti aggiornarlo per notare che non ~/.launchd.confè ancora supportato e non funziona a partire da OS X 10.8.3? Vediman launchd.conf
mklement0

12

Penso che ciò che l'OP sta cercando sia una soluzione semplice, simile a Windows.

ecco qui:

https://www.macupdate.com/app/mac/14617/rcenvironment


1
Wow, sembra fantastico. non l'ho ancora provato ma sembra esattamente ciò di cui avevo bisogno dalla descrizione.
Abdullah Jibaly,

6
a proposito, il link originale sembra essersi rotto da quando l'ho pubblicato (qual è il problema con Apple? I 301 sono costosi?). Puoi invece usare questo link: macupdate.com/app/mac/14617/rcenvironment
Tom Teman

Questo è davvero vecchio. Dai un'occhiata all'altra risposta che menziona osx-env-sync per una soluzione moderna che funziona anche con OS X 10.10 (Yosemite) e versioni successive.
Warren P

1
Riassumi le informazioni dal link nella tua risposta. Come abbiamo già visto, i collegamenti si interrompono per una serie di motivi.
user3.1415927

7

Puoi leggere su Linux, che è abbastanza vicino a ciò che è Mac OS X. Oppure puoi leggere su BSD Unix, che è un po 'più vicino. Per la maggior parte, le differenze tra Linux e BSD non ammontano molto.

/etc/profile sono variabili di ambiente di sistema.

~/.profile sono variabili d'ambiente specifiche dell'utente.

"dove devo impostare la mia variabile JAVA_HOME?"

  • Hai più utenti? A loro importa? Cambieresti un altro utente cambiando un /etc/profile?

In generale, preferisco non scherzare con le impostazioni di tutto il sistema anche se sono l'unico utente. Preferisco modificare le mie impostazioni locali.


5

Per le app della GUI, dovrai creare e modificare ~/.MacOSX/environment.plist. Maggiori dettagli qui . Dovrai disconnetterti affinché questi abbiano effetto. Non sono sicuro che influenzino anche le applicazioni avviate dal Terminale, ma suppongo che lo farebbero.

Per le app avviate da Terminal, puoi anche modificare il file ~ / .profile.


2
Sì, Terminal erediterà le variabili, così come qualsiasi cosa lanciata da Terminal. È possibile utilizzare il riquadro delle preferenze di RCenvironment per mantenere le variabili.
Gilimanjaro,

1
Questa soluzione non funziona più con alcune revisioni di Mac OS X v10.7. Non con alcuna revisione di Mac OS X v10.8 o successiva. Invece, vedi: stackoverflow.com/a/4567308/543738
LS

3

Basta aprire il ~/.profilefile, tramite nanoin Terminale e digitare lì:

export PATH=whatever/you/want:$PATH

Salva questo file (cmd + X e Y). Dopodiché, disconnetti / accedi di nuovo o apri una nuova scheda in Terminale e prova a utilizzare la nuova variabile.

PER FAVORE, NON dimenticare di aggiungere ": $ PATH" dopo quello che vuoi, altrimenti cancellerai tutti i percorsi nella variabile PATH, che erano lì prima.


4
Questo vale solo per l'ambiente di comando bash. Le variabili impostate qui non sono visibili dalle applicazioni GUI.
Warren P

3

Sincronizza le variabili di ambiente OS X per la riga di comando e le applicazioni della GUI da un'unica fonte con osx-env-sync .

Ho anche pubblicato una risposta a una domanda correlata qui .


È fantastico. Suggerimento: inserisci l'oggetto launchctl Unload / Launctl Load "Aggiorna ora" in uno script. L'ho chiamato osx-env-sync-now.sh. Modifico il mio .bash_profile ed eseguo il piccolo script "aggiorna ora" e continuo. Penso che ci siano implicazioni di sicurezza qui, quindi penso che dovrebbero essere fatte alcune limitazioni. Devono esserci dei motivi per cui hanno disattivato questa funzionalità in OS X.
Warren P

@WarrenP Fatto! Controlla il repository.
Ersin Er

Eccellente. Questo ha risolto molto dolore per me. Un caso in cui questo è davvero utile è per chiunque sviluppi con SCALA. L'impostazione di SCALA_HOME sia per la scala della riga di comando che per la scala della GUI (come nei netbeans) è un vero dolore altrimenti.
Warren P

0

Se si desidera modificare le variabili di ambiente in modo permanente su macOS, impostarle /etc/paths. Nota , questo file è di sola lettura per impostazione predefinita, quindi dovrai chmod per le autorizzazioni di scrittura.


Questo non funziona per me. Ho /usr/bin/localin quel file, anche senza modificare il file, era così per impostazione predefinita, eppure le mie app GUI vedono solo /usr/bin:/bin:/usr/sbin:/sbin. Ho riavviato molte volte.
mgol

@m_gol Cosa ottieni quando corri cat /etc/paths/?
IgorGanapolsky,

1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, in righe separate. Eppure SourceTree li vede tutti tranne il primo.
mgol

Potresti voler modificare in "Se vuoi cambiare il percorso predefinito in macOS". Questo non ha nulla a che fare con il problema più generale delle variabili d'ambiente.
rfay,

0

Per gli utenti di Mac OS X Catalina 2020:

Dimentica altre risposte inutili, qui sono necessari solo due passaggi:

  1. Crea un file con la convenzione di denominazione: Priority-Appname. Quindi copia e incolla il percorso che desideri aggiungere PATH.

    Ad esempio 80-vscodecon contenuti /Applications/Visual Studio Code.app/Contents/Resources/app/bin/nel mio caso.

  2. Sposta quel file in /etc/paths.d/. Non dimenticare di aprire una nuova scheda (nuova sessione) nel Terminale e digitare echo $PATHper verificare che il tuo percorso sia stato aggiunto!

Avviso: questo metodo aggiunge solo il percorso a PATH.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.