Domanda

Aggiornamento: il link sottostante 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 di 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 variabile JAVA_HOME ?


EDIT:

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

È stato utile?

Soluzione

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 .bashrc o 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 = qualunque cosa: tu: vuoi ; non è necessario riavviare il terminale).

Altri suggerimenti

Esistono diversi punti 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 : questo è invocato per le shell che non sono shell di login. Utilizzalo 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.
  • istanza launchd dell'utente: si applica a tutti i programmi avviati dall'utente, dalla GUI e dalla CLI. Puoi applicare le modifiche in qualsiasi momento utilizzando il comando setenv in launchctl . In teoria , dovresti essere in grado di inserire i comandi setenv in ~ / .launchd.conf e launchd sarebbe leggili automaticamente quando l'utente accede, ma in pratica il supporto per questo file non è mai stato implementato. Invece, puoi usare un altro meccanismo per eseguire uno script al momento del login e far sì che lo script chiami launchctl per impostare l'ambiente launchd .
  • /etc/launchd.conf : viene letto da launchd all'avvio del sistema e quando un utente accede. Hanno effetto su ogni singolo processo del sistema, poiché launchd è il processo principale. Per applicare le modifiche al root di avvio in esecuzione, è possibile reindirizzare i comandi in 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 prevede 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.conf non funziona, puoi inserire il seguente script in ~ / 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 inserire setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE all'interno di ~ / .launchd.conf e 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 è necessario, puoi chiamare launchctl come segue: launchctl setenv MYVARIABLE " QUOTE THE STRING " .

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

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

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 di ambiente specifiche dell'utente.

" dove devo impostare la mia variabile JAVA_HOME? "

  • Hai più utenti? A loro importa? Vuoi rovinare qualche altro utente modificando un / etc / profile ?

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

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

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

Basta aprire il file ~ / .profile , tramite nano in Terminale e digitare lì:

export PATH=whatever/you/want:$PATH

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

PER FAVORE, NON dimenticare di aggiungere ": $ PERCORSO " dopo qualunque / tu / desideri, altrimenti cancellerai tutti i percorsi nella variabile PATH, che erano lì prima.

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 .

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top