Impostazione delle variabili di ambiente in OS X per applicazioni GUI


18

In che modo è possibile impostare le variabili di ambiente in Mac OS X in modo tale che siano disponibili per le applicazioni della GUI senza utilizzare ~ / .MacOSX / environment.plist o hook di accesso (poiché questi sono obsoleti )?


@ ersin-er La risposta di StackOverflow "Soluzione sia per la riga di comando che per le app della GUI da un'unica fonte (funziona con Yosemite ed El Capitan)" potrebbe interessare le persone che trovano questa domanda.
l

Risposte:


16

Su Mountain Lion tutto /etc/pathse il /etc/launchd.confmontaggio non ha alcun effetto!

I forum degli sviluppatori di Apple dicono:

"Modifica la Info.plist del .app stesso per contenere un dizionario" LSEnvironment "con le variabili di ambiente che desideri.

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

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

Mostra contenuto della confezione

e ha 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'app (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.


1
Grazie! Questo è stato perfetto per me. Il 10.11 (El Capitan) ho dovuto anche eseguire i comandi forniti da Matthew per Info.plistrendere effettive le mie modifiche .
dsedivec,

8

La soluzione utilizza la funzionalità di launchctl, combinata con un Launch Agent per imitare i vecchi hook di login. Per altre soluzioni che utilizzano il negozio di launchd, vedere questo confronto . L'agente di avvio utilizzato qui si trova in / Library / LaunchAgents / :

<?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>user.conf.launchd</string>
    <key>Program</key>
    <string>/Users/Shared/conflaunchd.sh</string>
    <key>ProgramArguments</key>
    <array>
        <string>~/.conf.launchd</string>
    </array>
    <key>EnableGlobbing</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>LimitLoadToSessionType</key>
    <array>
        <string>Aqua</string>
        <string>StandardIO</string>
    </array>
</dict>
</plist>

Una cosa importante è la chiave RunAtLoad in modo che l'agente di avvio venga eseguito il prima possibile. Il vero lavoro viene svolto nello script della shell /Users/Shared/conflaunchd.sh , che legge ~ / .conf.launchd e lo alimenta a launchctl:

#! /bin/bash

#filename="$1"
filename="$HOME/.conf.launchd"

if [ ! -r "$filename" ]; then
    exit
fi

eval $(/usr/libexec/path_helper -s)

while read line; do
    # skip lines that only contain whitespace or a comment
    if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi

    eval launchctl $line
done <"$filename"

exit 0

Notare la chiamata di path_helperper impostare PATH correttamente. Infine, ~ / .conf.launchd sembra così

setenv PATH ~/Applications:"${PATH}"

setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:

# Locale
setenv LANG en_US.UTF-8

Questi sono launchctlcomandi, vedere la sua manpage per ulteriori informazioni. Funziona bene per me (devo dire che sono ancora un ragazzo di Snow Leopard), applicazioni GUI come texstudio e TeXShop possono vedere il mio proprio albero tex. Cose che possono essere migliorate:

  1. Lo script della shell ha un #filename="$1"in esso. Ciò non è casuale, poiché il nome del file deve essere inserito nello script dall'agente di avvio come argomento, ma non funziona.

  2. Come menzionato qui (tedesco e dietro un paywall!), È possibile inserire la sceneggiatura nell'agente di lancio stesso.

  3. Non sono sicuro di quanto sia sicura questa soluzione, in quanto utilizza eval con le stringhe fornite dall'utente.

  4. Penso di ricordare che la definizione di MANPATH usando questo metodo non ha funzionato bene, ma non ne sono sicuro.

Va detto che Apple ha inteso un approccio un po 'simile inserendo elementi in launch / launchd.conf , ma al momento non è supportato in questa data e nel sistema operativo (vedere la manpage di launchd.conf). Immagino che cose come il globbing non funzionerebbero come fanno in questa proposta. E ovviamente si possono mettere questi file altrove, tranne l'agente di avvio che deve risiedere in / Library / LaunchAgents / o ~ / Library / LaunchAgents / .

Infine, dovrei menzionare le fonti che ho usato come informazioni sugli agenti di lancio: 1 , 2 , 3 , 4 .

Aggiornamento : al momento non funziona con la versione 10.8. Le soluzioni alternative per applicazione sono descritte qui e qui .


A proposito, se si vuole definire la PATH-Variable in un ambiente Terminal e utilizzare questo launch agent, suggerisco di scrivere export PATH=.:"$(launchctl getenv PATH)"in ~ / .bash_profile (in modo simile per altre shell). Ciò è possibile poiché path_helperviene chiamato nello script della shell. Per maggiori dettagli sulla variabile PATH in OS X, controlla questa risposta .
Percival Ulisse il

3

La risposta fornita da @flori funziona per me su Maverick a condizione che eseguo i seguenti comandi in Terminal dopo aver modificato il file plist

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 

killall Finder

Ho avuto lo stesso comportamento con El Capitan e ho aggiunto il tuo punto alla risposta di @ flori
Seki,

2

La risposta fornita da @ percival-ulysses funziona per me su 10.9 Mavericks con il seguente piccolo cambiamento: modifica lo script /Users/Shared/conflaunchd.sh subito prima exit 0e aggiungi le righe

killall Dock
killall SystemUIServer

per riavviare il Dock e la barra dei menu. Successivamente, le applicazioni avviate dal Dock o da Spotlight erediteranno il PERCORSO corretto. Se usi Finder per avviare le applicazioni PATH-critical, allorakillall Finder possibile aggiungere anche questo.

Nel .bash_profileuso la linea

export PATH=`launchctl getenv PATH`

per impostare il PERCORSO per il Terminale, in questo modo il PERCORSO è controllato dalla stessa posizione, il file ~ / .conf.launchd .


0

Un'altra opzione è usare /etc/launchd.conf. Ad esempio ho modificato il valore predefinito PATHaggiungendo questa riga a /etc/launchd.conf:

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

È possibile applicare le modifiche /etc/launchd.confriavviando o eseguendolaunchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf terminando e processi.

Le impostazioni si /etc/launchd.confapplicano sia al processo di avvio principale sia ai processi di avvio per utente. Le variabili d'ambiente impostate con setenvin /etc/launchd.confsono mostrate da entrambi sudo launchctl exporte launchctl export.

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.