Impostazione delle variabili di ambiente su OS X


849

Qual è il modo corretto di modificare le variabili di ambiente come PATH in OS X?

Ho guardato un po 'su Google e ho trovato tre diversi file da modificare:

  • / etc / percorsi
  • ~ / .Profile
  • ~ / .Tcshrc

Non ho nemmeno alcuni di questi file e sono abbastanza sicuro che .tcshrc sia sbagliato, dato che OS X ora usa bash. Dove sono definite queste variabili, in particolare il PERCORSO?

Sto eseguendo OS X v10.5 (Leopard).


env "switch.1.disabled=true" open -n /Applications/Eclipse.app/per avviare l'applicazione GUI con un nuovo ambiente di sistema impostato.
Hong

Risposte:


652

Bruno è sulla buona strada. Ho svolto ricerche approfondite e se si desidera impostare variabili disponibili in tutte le applicazioni della GUI, l'unica opzione è /etc/launchd.conf.

Si noti che environment.plist non funziona per le applicazioni avviate tramite Spotlight. Questo è documentato da Steve Sexton qui .

  1. Apri un prompt del terminale

  2. Tipo sudo vi /etc/launchd.conf(nota: questo file potrebbe non esistere ancora)

  3. Inserisci contenuti come i seguenti nel file

    # Set environment variables here so they are available globally to all apps
    # (and Terminal), including those launched via Spotlight.
    #
    # After editing this file run the following command from the terminal to update
    # environment variables globally without needing to reboot.
    # NOTE: You will still need to restart the relevant application (including
    # Terminal) to pick up the changes!
    # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
    #
    # See http://www.digitaledgesw.com/node/31
    # and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
    #
    # Note that you must hardcode the paths below, don't use environment variables.
    # You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
    #
    setenv JAVA_VERSION 1.6
    setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
    setenv GROOVY_HOME /Applications/Dev/groovy
    setenv GRAILS_HOME /Applications/Dev/grails
    setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
    setenv JRUBY_HOME /Applications/Dev/jruby
    
    setenv ANT_HOME /Applications/Dev/apache-ant
    setenv ANT_OPTS -Xmx512M
    
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
    setenv M2_HOME /Applications/Dev/apache-maven
    
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
  4. Salva le modifiche in vi e riavvia il Mac. Oppure usa il comando grep/ xargsche è mostrato nel commento di codice sopra.

  5. Dimostra che le tue variabili funzionano aprendo una finestra Terminale e digitando exporte dovresti vedere le tue nuove variabili. Questi saranno disponibili anche in IntelliJ IDEA e altre applicazioni GUI avviate tramite Spotlight.


3
Sto dicendo che la risposta accettata (environment.plist) non ha avuto successo per me. Ho usato con successo l'approccio launchd.conf su 10.5 e 10.6 su quattro macchine.
Matthew McCullough,

54
C'è un modo di fare questo , senza fare un riavvio del sistema ?
sorin,

40
La limitazione sopra menzionata si applica a MacOS X 10.5. Tuttavia MacOS X 10.6 non presenta più questa limitazione e l'impostazione dei valori all'interno di environment.plist funziona bene anche per le app avviate tramite Spotlight. Quindi la risposta selezionata è corretta per Snow Leopard ;-)
Louis Jacomet

5
L'impostazione launchd.confè a senso unico, ma necessita di un riavvio (per riavviare launchd). Se vuoi evitare un riavvio, vedi la mia risposta stackoverflow.com/questions/135688/…
Matt Curtis,

23
Esistono diversi problemi con l'approccio launchd presentato. La maggior parte sono specifici della variabile d'ambiente PATH, ma il richiedente ha citato in particolare PATH. 1) gli elementi in launchd.conf non vengono applicati in shell interattive come ssh nel sistema. 2) la riga "setenv PATH / testdir" si aggiunge al PATH in Terminal.app, ma elimina tutti gli altri elementi PATH negli ambienti delle applicazioni OS X. 3) Fare "setenv PATH $ {PATH}: / testdir" in /etc/launchd.conf non espande correttamente $ PATH 4 esistente) launchd.conf si applica a tutti gli utenti, anziché a uno solo. Non che abbia una soluzione migliore.
Noah R

257

Come impostare l'ambiente per i nuovi processi avviati da Spotlight (senza necessità di riavviare)

È possibile impostare l'ambiente utilizzato da launchd (e, per estensione, qualsiasi cosa sia stata avviata da Spotlight) con launchctl setenv. Ad esempio per impostare il percorso:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

O se vuoi impostare il tuo percorso in .bashrco simile, allora rispecchiarlo in launchd:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

Non è necessario riavviare tuttavia sarà necessario riavviare un'app se si desidera che raccolga l'ambiente modificato.

Questo include tutte le shell già in esecuzione su Terminal.app, anche se se ci sei puoi impostare l'ambiente più direttamente, ad es. Con export PATH=/opt/local/bin:/opt/local/sbin:$PATH bash o zsh.

Come mantenere le modifiche dopo un riavvio

Per mantenere le modifiche dopo un riavvio è possibile impostare le variabili di ambiente da /etc/launchd.conf, in questo modo:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf viene eseguito automaticamente al riavvio.

Se vuoi che queste modifiche launchctl.confabbiano effetto ora, dovresti usare questo comando per rielaborare (grazie @mklement per il suggerimento!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

Puoi scoprire di più launchctle come si carica launchd.confcon il comando man launchctl.


2
Molto bello! Il vantaggio di usare environment.plist sembra essere che OS X onora il contenuto di quei file senza il fastidio di dover prima avviare un terminale. Ad ogni modo, penso che la tua risposta si sia concentrata principalmente sull'evitare la necessità di un riavvio, quindi grazie per quello.
fotNelton,

2
@kapuzineralex Sì, evita il riavvio, inoltre cambia l'ambiente per i programmi avviati da Spotlight, il che environment.plistnon funziona.
Matt Curtis,

2
L'impostazione dell'ambiente in questo modo ha funzionato per me solo fino al riavvio. La variabile di ambiente non è durata dopo il riavvio del mac. La risposta di Matthew ha funzionato perfettamente per me.
Shamal Karunarathne,

8
@Shamal: ho fatto +1 sul tuo commento, ma tieni presente che la risposta di Matthew richiede un riavvio, mentre sto indicando il modo corretto di cambiarlo senza riavviare. Se vuoi entrambi, ti suggerisco di mettere le impostazioni del tuo percorso in launchd.conf (in modo che persistano attraverso i riavvii) e quindi utilizzare uno script con qualcosa come questo "source /etc/launchctl.conf; launchctl setenv PATH $ PATH", quindi puoi anche "aggiornare" quando non vuoi riavviare.
Matt Curtis,

5
@MattCurtis Potresti modificare direttamente la tua risposta per chiarire che, mentre non è necessario il riavvio, le modifiche andranno effettivamente perse dopo un riavvio? Inoltre, il modo corretto di applicare le modifiche in etc/launchd.confprima di un riavvio potrebbe essere quella di utilizzare l'approccio in @ risposta di MatthewMcCullough: egrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl.
mklement0

106

Fino a OS X v10.7 incluso (Lion)puoi impostarli in:

~/.MacOSX/environment.plist

Vedere:

Per PATH nel Terminale, dovresti essere in grado di impostare .bash_profile o .profile(probabilmente dovrai crearlo però)

Per OS X v10.8 (Mountain Lion) e oltre è necessario utilizzare launchdelaunchctl .


4
Questo è solo se effettivamente ti aspetti che vengano utilizzati dalle app grafiche. Dal momento che in genere non utilizzano le variabili di ambiente, non è un buon posto per impostarle.
Chris Hanson,

18
Ci sono alcuni ottimi esempi di app grafiche che usano variabili d'ambiente. Ad IntelliJ, ad esempio, piace poter vedere M2_HOME per sapere dove vive Maven. Per vederlo vedere la variabile, è necessario impostarlo in /etc/launchd.conf invece di environment.plist.
Matthew McCullough,

3
Per riferimento: l'utilizzo preferences.plistera meno che ideale con OS X 10.5 poiché a quel tempo preferences.plistnon veniva letto per le applicazioni avviate tramite Spotlight, vedere il commento di Louis alla risposta di Matthew e e-mail.esm.psu.edu/pipermail/macosx-emacs/2010-May /002113.html . Per OS X 10.6 environment.plistfunziona esattamente come dovrebbe.
Giano,

16
Questo non è più applicabile a OSX 10.8 apple.stackexchange.com/questions/57385/…
thatsmydoing

1
@tim_yates Potresti modificare la prima riga della tua risposta per leggere "Fino a Lion incluso (10. * 7 *)", dato che è corretto? Ho provato a fare quella modifica sull'originale, ambiguo "Up to Mountain Lion", e i revisori l'hanno fallito.
mklement0

67

Soluzione per riga di comando e applicazioni GUI da un'unica fonte (funziona con Mac OS X v10.10 (Yosemite) e Mac OS X v10.11 (El Capitan))

Supponiamo che tu abbia le definizioni delle variabili di ambiente nel tuo ~/.bash_profilelike nel seguente frammento:

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

Abbiamo bisogno di un Launch Agent che verrà eseguito ad ogni accesso e in qualsiasi momento su richiesta che caricherà queste variabili nella sessione utente. Avremo anche bisogno di uno script di shell per analizzare queste definizioni e creare i comandi necessari per essere eseguiti dall'agente.

Creare un file con plistsuffisso (ad esempio denominato osx-env-sync.plist) nella ~/Library/LaunchAgents/directory con i seguenti contenuti:

<?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>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-lil parametro è fondamentale qui; è necessario per eseguire lo script della shell con una shell di login, in modo che ~/.bash_profilesia originato prima di eseguire questo script.

Ora, lo script della shell. Crealo ~/.osx-env-sync.shcon i seguenti contenuti:

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

Assicurarsi che lo script della shell sia eseguibile:

chmod +x ~/.osx-env-sync.sh

Ora carica l'agente di avvio per la sessione corrente:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(Ri) Avvia un'applicazione GUI e verifica che sia in grado di leggere le variabili di ambiente.

L'installazione è persistente. Sopravviverà a ricominciare e ricominciare.

Dopo l'installazione iniziale (che hai appena fatto), se vuoi riflettere di nuovo eventuali cambiamenti nel ~/.bash_profiletuo intero ambiente, rieseguendo il launchctl load ...comando non eseguirai ciò che desideri; invece riceverai un avviso come il seguente:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

Per ricaricare le variabili di ambiente senza passare attraverso il processo di logout / login, procedi come segue:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

Infine, assicurati di riavviare le applicazioni già in esecuzione (incluso Terminal.app) per renderle consapevoli delle modifiche.

Ho anche spinto il codice e le spiegazioni qui in un progetto GitHub: osx-env-sync .

Spero che questa sia la soluzione definitiva, almeno per le ultime versioni di OS X (Yosemite & El Capitan).


Funziona bene. Leggermente preoccupato se questo fosse diventato popolare se fosse una scappatoia di sicurezza
Warren P

3
Questa soluzione è stata l'unica che ho potuto far funzionare correttamente. Grandi soluzioni. Non riesco a capire perché questo dovrebbe essere così difficile su Mac ...
JohnyTex,

2
Questo non funziona su El Capitan, sfortunatamente. Il tuo commento da github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508 spiega bene il problema.
mgol

1
Quindi, questa soluzione non funziona, /etc/launchd.conf non ha alcun effetto, Node.js installa il suo binario su / usr / local / bin e questo percorso non è in PATH per le app della GUI. Pertanto, gli hook Git che utilizzano Node non funzionano affatto nelle app Git della GUI come SourceTree in El Capitan. È terribile.
mgol

1
Il problema riguarda solo la variabile PATH. Spero di trovare presto una soluzione.
Ersin Er,

54
  1. Fare:

    vim ~/.bash_profile

    Il file potrebbe non esistere (in caso contrario, puoi semplicemente crearlo).

  2. Digita questo e salva il file:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Correre

    source ~/.bash_profile

+1 exportè quello che stavo per suggerire, dal momento che BASH non supportasetenv
vol7ron,

Funziona per ora. Tutta questa faccenda sembra molto più complicata di quanto pensassi. Dovremo dedicare un po 'più di tempo a tutto ciò in seguito. Grazie.
Ruto Collins,

34

Esistono essenzialmente due problemi da risolvere quando si tratta delle variabili di ambiente in OS X. Il primo è quando si invocano programmi da Spotlight (l'icona della lente di ingrandimento sul lato destro del menu Mac / barra di stato) e il secondo quando si invocano programmi dal Dock . Invocare programmi da un applicazione Terminale / utilità è banale perché legge l'ambiente dalle posizioni standard della shell ( ~/.profile, ~/.bash_profile, ~/.bashrc, etc.)

Quando si invocano programmi dal Dock, utilizzare ~/.MacOSX/environment.plist dove l' <dict>elemento contiene una sequenza di <key>KEY</key><string>theValue</string>elementi.

Quando si invocano i programmi da Spotlight, assicurarsi che launchd sia stato configurato con tutte le impostazioni chiave / valore richieste.

Per risolvere entrambi i problemi contemporaneamente, utilizzo un elemento di accesso (impostato tramite lo strumento Preferenze di Sistema) sul mio account utente. L'elemento di login è uno script bash che richiama una funzione lisp di Emacs sebbene sia possibile utilizzare il loro strumento di scripting preferito per ottenere lo stesso risultato. Questo approccio ha l'ulteriore vantaggio di funzionare in qualsiasi momento e non richiede un riavvio, ovvero è possibile modificare ~/.profile, eseguire l'elemento di accesso in una shell e avere le modifiche visibili per i programmi appena richiamati, dal Dock o Spotlight.

Dettagli:

Elemento di accesso: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Funzione emacs lisp: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

NOTA: questa soluzione è un amalgama di coloro che sono venuti prima che io aggiungessi il mio, in particolare quello offerto da Matt Curtis, ma ho deliberatamente cercato di mantenere ~/.bash_profileindipendente la mia piattaforma di contenuti e di impostare l' launchdambiente (una struttura solo per Mac) in uno script separato .


20
Wow. Non sto dicendo che non funzionerà, ma ... Sono solo sconvolto dalla complessità richiesta per ottenere un ambiente coerente su OS X.
offby1

2
Funziona meglio di tutte le soluzioni che ho visto per 10.9. L'unico difetto è che, poiché gli elementi di accesso vengono eseguiti in un ordine indeterminato, se Emacs (ad esempio) viene avviato all'accesso (perché era aperto al logout, ad esempio), non avrà necessariamente le variabili di ambiente a meno che non lo si riavvii , perché viene lanciato prima che lo script sia.
Telotortium,

22

Un'altra soluzione open source, open source, per Mac OS X v10.8 (Mountain Lion) pane / ambiente.plist è EnvPane .

Il codice sorgente di EnvPane disponibile su GitHub . EnvPane sembra avere caratteristiche comparabili a RCEnvironment , tuttavia sembra che possa aggiornare istantaneamente le sue variabili memorizzate, ovvero senza la necessità di riavviare o accedere, il che è il benvenuto.

Come affermato dallo sviluppatore:

EnvPane è un riquadro delle preferenze per Mac OS X 10.8 (Mountain Lion) che consente di impostare variabili di ambiente per tutti i programmi in sessioni grafiche e terminali. Non solo ripristina il supporto per ~ / .MacOSX / environment.plist in Mountain Lion, ma pubblica anche le modifiche all'ambiente immediatamente, senza la necessità di disconnettersi e riconnettersi. <SNIP> EnvPane include (e installa automaticamente) un agente launchd che esegue 1) subito dopo il login e 2) ogni volta che il ~ / .MacOSX / environment.plist cambia. L'agente legge ~ / .MacOSX / environment.plist ed esporta le variabili di ambiente da quel file all'istanza launchd dell'utente corrente tramite la stessa API utilizzata da launchctl setenv e launchctl unsetenv.

Disclaimer: non sono in alcun modo correlato allo sviluppatore o al suo progetto.

PS Mi piace il nome (suona come "Ends Pain").


2
EnvPane non può impostare PATH al momento. Per maggiori dettagli vedi la mia segnalazione di bug: github.com/hschmidt/EnvPane/issues/5
Uwe Günther

Io ♥ ️ questa cosa .. L'unico inconveniente .. che penso QUALSIASI soluzione sarà vittima di ... è - dover riavviare un processo - per ereditare il nuovo "ambiente". Vinto Wonk.
Alex Gray,

2
@sorin: puoi aprire un problema sul sito GitHub con una descrizione del problema riscontrato? EnvPane lavora per me il 10.10. Disclaimer: sono l'autore di EnvPane.
Hannes,

17

Aggiornamento (2017-08-04)

A partire da (almeno) macOS 10.12.6 (Sierra) questo metodo sembra aver smesso di funzionare per Apache httpd (sia per systeml' useropzione dilaunchctl config ). Altri programmi non sembrano essere interessati. È ipotizzabile che questo sia un bug in httpd.

Risposta originale

Ciò riguarda OS X 10.10+ (10.11+ specificamente dovuto alla modalità rootless dove /usr/bin non è più scrivibile).

Ho letto in più punti che l'utilizzo launchctl setenv PATH <new path>di impostare la PATHvariabile non funziona a causa di un bug in OS X (che sembra vero per esperienza personale). Ho scoperto che esiste un altro modo in cui è PATHpossibile impostare le applicazioni non avviate dalla shell :

sudo launchctl config user path <new path>

Questa opzione è documentata nella pagina man launchctl:

sistema di configurazione | valore del parametro utente

Imposta le informazioni di configurazione persistenti per i domini launchd (8). È possibile configurare solo il dominio di sistema e i domini utente. Il percorso della memoria persistente è un dettaglio dell'implementazione e le modifiche a tale memoria devono essere apportate solo tramite questo sottocomando. È necessario un riavvio per rendere effettive le modifiche apportate tramite questo sottocomando.

[...]

sentiero

Imposta la variabile di ambiente PATH per tutti i servizi all'interno del dominio di destinazione sul valore stringa. Il valore della stringa deve essere conforme al formato indicato per la variabile d'ambiente PATH in environment (7). Se un servizio specifica il proprio PERCORSO, la variabile di ambiente specifica del servizio avrà la precedenza.

NOTA: questa funzione non può essere utilizzata per impostare variabili di ambiente generali per tutti i servizi all'interno del dominio. È intenzionalmente mirato alla variabile di ambiente PATH e nient'altro per motivi di sicurezza.

Ho confermato che funziona con un'applicazione GUI avviata da Finder (che utilizza getenvper ottenere PATH). Nota che devi farlo una sola volta e la modifica sarà persistente attraverso i riavvii.


Funziona anche per me. sudo launchctl procinfo <gui-pid>mostra l' PATHambiente appena impostato . Ma in sudo launchctl config user path <new path>realtà impostato per tutti gli utenti ... (confermato aggiungendo un nuovo utente e usando la console python di Sublime Text)
Bossliaw,

1
Ciò non sembra influire sulla variabile d'ambiente PATH delle applicazioni che vengono riaperte all'accesso (che erano aperte al momento dello spegnimento).
Brecht Machiels,

Interessante. Ciò significherebbe che per le applicazioni che verranno riaperte l'ambiente (o un suo sottoinsieme) viene salvato.
Max Leske,

@MaxLeske No, le applicazioni riaperte vengono avviate prima che la variabile di ambiente venga modificata. Quindi, non è solo la prima volta dopo averlo fatto sudo launchctl config user pathche ciò accada (cosa che sembra assumere?).
Brecht Machiels,

1
@ShlomiSchwartz launchctlnon non consente di impostare le variabili di ambiente arbitrarie. La PATHvariabile è un'eccezione.
Max Leske,

17

Su Mountain Lion tutto /etc/pathse/etc/launchd.conf montaggio non ha alcun effetto!

I forum degli sviluppatori di Apple dicono:

"Cambia la Info.plist del .app stesso per contenere un dizionario" LSEnvironment "con le variabili d'ambiente che desideri.

~ / .MacOSX / environment.plist non è più supportato. "

Quindi ho modificato direttamente l'applicazione Info.plist(fare clic con il tasto destro su "AppName.app" (in questo caso SourceTree) e poi " Show package contents").

Mostra contenuto della confezione

E ho aggiunto una nuova coppia chiave / dict chiamata:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(vedi: Documentazione LaunchServicesKeys su Apple )

Inserisci qui la descrizione dell'immagine

Ora l'applicazione (nel mio caso Sourcetree) usa il percorso indicato e funziona con Git 1.9.3 :-)

PS: Ovviamente devi adattare la voce Path alle tue esigenze specifiche.


3
Questa soluzione soddisfa lo standard meno invasivo del sistema. Grazie.
John Vance,

@John Vance +1 Completamente d'accordo, i cambiamenti a livello di sistema sono sempre rischiosi, come spiega chiaramente Jason T. Miller nella sua risposta
rmcsharry,

5
Non ha alcun effetto per me in El Capitan. :(
mgol

Su High Sierra 10.13, se Info.plistLSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
modifico

16

Mentre le risposte qui non sono "sbagliate", ne aggiungo un'altra: non apportare mai modifiche alle variabili di ambiente in OS X che influiscono su "tutti i processi", o addirittura, al di fuori della shell, per tutti i processi eseguiti in modo interattivo da un determinato utente.

Nella mia esperienza, le modifiche globali alle variabili di ambiente come PATH per tutti i processi hanno ancora più probabilità di rompere le cose su OS X che su Windows. A ragione, molte applicazioni OS X e altri software (compresi, forse, in particolare, i componenti del sistema operativo stesso) si basano su strumenti della riga di comando UNIX sotto il cofano e assumono il comportamento delle versioni di questi strumenti fornite con il sistema, e non utilizzare necessariamente percorsi assoluti durante l'operazione (commenti simili si applicano alle librerie caricate dinamicamente e alle variabili di ambiente DYLD_ *). Considera, ad esempio, che le risposte più votate alle varie domande di Stack Overflow sulla sostituzione delle versioni di interpreti fornite da OS X come Python e Ruby in genere dicono "non farlo".

OS X non è in realtà diverso da altri sistemi operativi simili a UNIX (ad esempio, Linux, FreeBSD e Solaris) in questo senso; il motivo più probabile per cui Apple non fornisce un modo semplice per farlo è perché rompe le cose . Nella misura in cui Windows non è soggetto a questi problemi, è dovuto a due cose: (1) il software Windows non tende a fare affidamento sugli strumenti della riga di comando nella misura in cui lo fa il software UNIX e (2) Microsoft ha avuto una storia così ampia sia di "DLL hell" che di problemi di sicurezza causati da modifiche che incidono su tutti i processi che hanno modificato il comportamento del caricamento dinamico nelle versioni più recenti di Windows per limitare l'impatto delle opzioni di configurazione "globali" come PATH.

"Lame" o no, avrai un sistema molto più stabile se limiti tali modifiche a ambiti più piccoli.


1
Dire alle persone di non fare la cosa che hanno chiesto come fare non è una risposta alla domanda che hanno posto. Impedire alle persone di farlo è anche rompere le cose. Modus operandi di Apple.
frabjous,

L'impostazione del PERCORSO in /Applications/App.app/Contents/Info.plist con la chiave LSEnvironment developer.apple.com/library/archive/documentation/General/… potrebbe essere la soluzione attualmente consigliata.
Dave X,

15

A volte tutte le risposte precedenti semplicemente non funzionano. Se vuoi avere accesso a una variabile di sistema (come M2_HOME) in Eclipse o in IntelliJ IDEA l'unica cosa che funziona per me in questo caso è:

Prima modifica (passaggio 1) /etc/launchd.confper contenere una riga come questa: "setenv VAR value" e quindi (passaggio 2) riavvia.

La semplice modifica di .bash_profile non funzionerà perché in OS X le applicazioni non vengono avviate come in altri Unix; non ereditano le variabili di shell del genitore. Tutte le altre modifiche non funzioneranno per un motivo che non mi è noto. Forse qualcun altro può chiarire questo.


5
Le applicazioni avviate da Spotlight o in qualsiasi altro modo hanno tutte /etc/launchd.conf lette dal loro processo genitore, rendendo così una scelta allettante per dove impostare variabili di ambiente visibili in tutte le app e shell.
Matthew McCullough,

1
Vedi la mia risposta per un'altra soluzione, che evita un riavvio - stackoverflow.com/questions/135688/…
Matt Curtis,

La mia macchina MaxOS 10.6 non ha il file /etc/launchd.conf presente. È una cosa nuova o obsoleta a partire da questa versione? O questa macchina è incasinata?
Peter

13

Dopo aver inseguito il riquadro delle preferenze Variabili d'ambiente e aver scoperto che il collegamento è interrotto e una ricerca sul sito di Apple sembra indicare che se ne siano dimenticati ... Sono tornato sulla scia del processo di avvio sfuggente.

Sul mio sistema (Mac OS X 10.6.8) sembra che le variabili definite in environment.plist vengano esportate in modo affidabile nelle app avviate da Spotlight (tramite launchd). Il mio problema è che quei var non vengono esportati in nuove sessioni bash in Terminal. Vale a dire che ho il problema opposto come rappresentato qui.

NOTA: environment.plist assomiglia a JSON, non a XML, come descritto in precedenza

Sono stato in grado di ottenere le app Spotlight per vedere le variabili modificando ~ / MacOSX / environment.plist e sono stato in grado di forzare le stesse variabili in una nuova sessione di Terminal aggiungendo quanto segue al mio file .profile:

eval $(launchctl export)

2
Non così sfuggente: RCenvironment
Gilimanjaro,

Un bel consiglio sull'esportazione launchctl. Ma non metterei questo così com'è in .profile. Sovrascriverà $ PATH con uno che non include / usr / local / bin. Ma puoi usare una regex per selezionare le variabili che ti interessano: `` eval $ (launchctl export | grep '^ my. * =').
marzo

3
Sulla mia nuova macchina Mountain Lion (10.8.2) environment.plist è completamente senza valore. Vedi la risposta di Matthew per la strada giusta. Si tratta di lanciare e l'app della riga di comando launchctl insieme a /etc/launchd.conf. Potete leggere voi stessi con man launchd, man launchctle man launchd.confin una finestra di terminale. Sono contento che Apple mantenga aggiornate le pagine man, anche se la Mac Developer Library è un po 'in ritardo.
Russell B,

10

Qualsiasi file di bash di avvio - ~/.bashrc, ~/.bash_profile, ~/.profile. C'è anche una sorta di strano file chiamato ~/.MacOSX/environment.plistper le variabili di ambiente nelle applicazioni GUI.


10

Proprio come la risposta di Matt Curtis, ho impostato le variabili di ambiente tramite launchctl, ma la avvolgo in una funzione chiamata export, in modo che ogni volta che esporto una variabile come normale nel mio .bash_profile, sia anche impostata da launchctl. Ecco cosa faccio:

  1. Il mio .bash_profile è costituito da una sola riga, (questa è solo una preferenza personale.)

    source .bashrc
  2. Il mio .bashrc ha questo:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. Quanto sopra sovraccaricherà l'esportazione incorporata di Bash ed esporterà tutto normalmente (noterai che esporto "esporta" con esso!), Quindi impostali correttamente per gli ambienti di app di OS X tramite launchctl, indipendentemente dal fatto che tu usi uno dei seguenti:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
  4. In questo modo non devo inviare ogni variabile a launchctl ogni volta, e posso solo avere il mio .bash_profile / .bashrc impostato come voglio. Apri una finestra del terminale, controlla le variabili di ambiente che ti interessano launchctl getenv myVar, cambia qualcosa nel tuo .bash_profile / .bashrc, chiudi la finestra del terminale e riaprila, controlla nuovamente la variabile con launchctl e voilá, è cambiata.

  5. Ancora una volta, come le altre soluzioni per il mondo post-Mountain Lion, affinché eventuali nuove variabili di ambiente siano disponibili per le app, è necessario avviarle o riavviarle dopo la modifica.


1
Risposta utile - grazie. L'ho appena aggiornato perché la tua soluzione originale non ha gestito i casi in cui il valore della variabile d'ambiente che stavi impostando conteneva segni di uguale (ad esempio, CXX_FLAGS = "- mmacosx-version-min = 10.9"
Steve Broberg,

@SteveBroberg - solo una modifica di un personaggio risolve la regexp di Bash senza bisogno di sed! (Non fraintendetemi, adoro sed, ma questo funziona ed è molto più breve.)
courtlandj

1
Ho pensato che ci sarebbe dovuto essere un modo migliore, ma non sono un guru bash, e non potevo google quali%%, ## erano, ecc.
Steve Broberg,

10

Ecco un modo molto semplice per fare quello che vuoi. Nel mio caso, stava facendo funzionare Gradle (per Android Studio).

  • Apri Terminale.
  • Esegui il seguente comando:

    sudo nano /etc/paths o sudo vim /etc/paths

  • Inserisci la tua password, quando richiesto.

  • Vai in fondo al file e inserisci il percorso che desideri aggiungere.
  • Colpire Control + Xper uscire.
  • Immettere 'Y' per salvare il buffer modificato.
  • Apri una nuova finestra del terminale quindi digita:

    echo $PATH

Dovresti vedere il nuovo percorso aggiunto alla fine del PERCORSO.

Ho ricevuto questi dettagli da questo post:

Aggiungi al PERCORSO su Mac OS X 10.8 Mountain Lion e versioni successive



7

Essere concisi e chiari su cosa è destinato ogni file

  • ~/.profile viene fornito ogni volta che viene lanciato Terminal.app
  • ~/.bashrc è dove "tradizionalmente" sono impostate tutte le istruzioni di esportazione per l'ambiente Bash
  • /etc/paths è il file principale in Mac OS che contiene l'elenco dei percorsi predefiniti per la creazione della variabile di ambiente PATH per tutti gli utenti
  • /etc/paths.d/ contiene file che contengono percorsi di ricerca aggiuntivi

I programmi non terminali non ereditano le variabili PATH e MANPATH di tutto il sistema che il tuo terminale fa! Per impostare l'ambiente per tutti i processi avviati da un utente specifico, rendendo così disponibili le variabili di ambiente per le applicazioni della GUI di Mac OS X, tali variabili devono essere definite nel~/.MacOSX/environment.plist (Domande e risposte tecniche Apple QA1067)

Utilizzare la seguente riga di comando per sincronizzare il proprio environment.plistcon /etc/paths:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"

6

/etc/launchd.conf non è utilizzato in OS X v10.10 (Yosemite), OS X v10.11 (El Capitan), macOS v10.12 (Sierra) o macOS v10.13 (High Sierra).


Dalla launchctlpagina man:

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

Il metodo descritto in questa risposta Ask Different funziona per me (dopo un riavvio): le applicazioni avviate dal Dock o da Spotlight ereditano le variabili di ambiente che ho impostato ~/Library/LaunchAgents/my.startup.plist. (Nel mio caso, dovevo impostare LANG, su en_US.UTF-8, per un plug-in Sublime Text.)


Al riavvio, esiste un ordine di caricamento che garantisce che my.startup.plist sia stato caricato prima del riavvio delle applicazioni dell'ultima sessione?
kunjbhai


3

È semplice:

Modifica ~ / .profile e metti le tue variabili come segue

$ vim ~ / .profile

Nel file messo:

MY_ENV_VAR = Valore

  1. Salva (: wq)

  2. Riavvia il terminale (Esci e riaprilo)

  3. Assicurati che vada tutto bene:

$ echo $ MY_ENV_VAR

$ value




3

Bene, non sono sicuro dei file /etc/pathse ~/.MacOSX/environment.plist. Quelli sono nuovi.

Ma con Bash, dovresti sapere che .bashrcviene eseguito con ogni nuova chiamata della shell e .bash_profileviene eseguito solo una volta all'avvio.

Non so quanto spesso ciò avvenga con Mac OS X. Penso che la distinzione si sia interrotta con il sistema a finestre che avviava tutto.

Personalmente, elimino la confusione creando un .bashrcfile con tutto ciò di cui ho bisogno e quindi faccio:

ln -s .bashrc .bash_profile

3

Una cosa da notare oltre agli approcci suggeriti è che, almeno in OS X 10.5 (Leopard), le variabili impostate launchd.confverranno unite alle impostazioni effettuate .profile. Suppongo che questo sia probabilmente valido anche per le impostazioni ~/.MacOSX/environment.plist, ma non ho verificato.


3

Imposta la variabile di ambiente PATH su Mac OS

Apri il programma Terminale (si trova nella cartella Applicazioni / Utility per impostazione predefinita). Esegui il seguente comando

touch ~/.bash_profile; open ~/.bash_profile

Questo aprirà il file nell'editor di testo predefinito.

Per Android SDK come esempio:

Devi aggiungere il percorso alla directory degli strumenti e degli strumenti della piattaforma SDK Android. Nel mio esempio userò "/ Development / android-sdk-macosx" come directory in cui è installato SDK. Aggiungi la seguente riga:

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

Salvare il file ed uscire dall'editor di testo. Esegui il tuo .bash_profile per aggiornare il tuo PERCORSO:

source ~/.bash_profile

Ora ogni volta che apri il programma Terminale il tuo PERCORSO includerà l'SDK di Android.


3

L'ho fatto davvero facilmente e velocemente. Per prima cosa crea un ~ / .bash_profile dal terminale:

touch .bash_profile

poi

open -a TextEdit.app .bash_profile

Inserisci

export TOMCAT_HOME=/Library/Tomcat/Home

salva la documentazione e il gioco è fatto.


Perfecto. Ho seguito i passaggi per JAVA_HOME, Ho appena aggiunto l'esportazione JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / Contenuti / Home e un vero successo!
NarendraC,

Ottimo @NarendraC!
CodeOverRide,

2

È abbastanza semplice. Modifica il file .profile(vi, nano , Sublime Text o altri editor di testo). Puoi trovarlo nella ~/directory (directory utente) e impostare in questo modo:

export MY_VAR=[your value here]

Esempio con Java home:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

Salvalo e torna al terminale.

Puoi ricaricarlo con:

source .profile

Oppure chiudi e apri la finestra del terminale.


2

Ci sono due tipi di shell in gioco qui.

  • Non login: .bashrc viene ricaricato ogni volta che si avvia una nuova copia di Bash
  • Accesso: il .profile viene caricato solo quando si accede o si dice esplicitamente a Bash di caricarlo e utilizzarlo come shell di accesso.

E 'importante capire che qui con Bash, il file .bashrcviene letto solo da un guscio che è sia interattivo e non di login, e troverete che le persone spesso caricano .bashrcin .bash_profileper superare questa limitazione.

Ora che hai le conoscenze di base, passiamo a come ti consiglierei di configurarlo.

  • .profile: crealo inesistente. Metti qui la tua configurazione PATH.
  • .bashrc: crea se inesistente. Inserisci tutti i tuoi alias e metodi personalizzati.
  • .bash_profile: crea se inesistente. Inserisci quanto segue.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#

2

Shell di accesso

/etc/profile

La shell esegue prima i comandi nel file /etc/profile. Un utente che lavora con i privilegi di root può impostare questo file per stabilire caratteristiche predefinite a livello di sistema per gli utenti che eseguono Bash.

.bash_profile
.bash_login
.profile

Avanti gli sguardi shell per ~/.bash_profile, ~/.bash_logine ~/.profile(~ / è mano a breve per la vostra home directory), in questo ordine, l'esecuzione dei comandi nel primo di questi file che trova. È possibile inserire comandi in uno di questi file per sovrascrivere i valori predefiniti impostati /etc/profile. Una shell in esecuzione su un terminale virtuale non esegue comandi in questi file.

.bash_logout

Quando ti disconnetti, bash esegue i comandi nel ~/.bash_logoutfile. Questo file contiene spesso comandi che vengono eliminati dopo una sessione, come quelli che rimuovono i file temporanei.

Conchiglie non logiche interattive

/etc/bashrc

Sebbene non sia chiamato direttamente da bash, molti ~/.bashrcfile chiamano /etc/bashrc. Questa configurazione consente a un utente che lavora con i privilegi di root di stabilire caratteristiche predefinite a livello di sistema per shell bash non login.

.bashrc

Una shell non login interattiva esegue i comandi nel ~/.bashrcfile. In genere un file di avvio per una shell di accesso, come ad esempio .bash_profile, esegue questo file, quindi entrambe le shell di accesso e non di accesso eseguono i comandi .bashrc.

Poiché i comandi in .bashrcpossono essere eseguiti molte volte e poiché le subshell ereditano le variabili esportate, è una buona idea inserire comandi che si aggiungono alle variabili esistenti nel .bash_profilefile.


2

Tutta la magia su iOS si limita all'utilizzo sourcecon il file, dove esporti le variabili di ambiente.

Per esempio:

Puoi creare un file come questo:

export bim=fooo
export bom=bar

Salvare questo file come bimbom.enve fare source ./bimbom.ev. Voilá, hai le variabili di ambiente.

Controllali con:

echo $bim

1

Per Bash, prova ad aggiungere le variabili di ambiente al file /etc/profileper renderle disponibili per tutti gli utenti. Non è necessario riavviare, basta avviare una nuova sessione Terminale.

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.