Imposta la variabile PATH in modo che venga rilevata in tutte le applicazioni, anche al di fuori del terminale. (El Captain)

6

Il mio ~/etc/path ha il seguente aspetto:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Il problema:

Quando digito echo $PATH nel terminale, torno:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

E questo persiste per ogni applicazione avviata nel terminale. Ad esempio, se digito emacs , quindi eseguo:

M-x getenv PATH

Il mio output è:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Tuttavia, se avvio emacs usando launchpad invece di terminal e ancora una volta invio M-x getenv PATH , il mio output è invece /usr/bin:/bin:/usr/sbin:/sbin .

Come puoi vedere la mia modifica in ~/etc/path , che era l'aggiunta di /usr/local/bin , manca.

Un altro esempio:

Uso un plugin per Firefox chiamato vimperator che emula la funzionalità di vim in Firefox. Ha una funzione che consente all'utente di modificare l'input della pagina web in vim. Tuttavia, questo non sembra funzionare su OS X. Su un'intuizione, digito il comando !echo $PATH in vimperator e vediamo quanto segue: /usr/bin:/bin:/usr/sbin:/sbin . Ovviamente, poiché il collegamento simbolico chiamato gvim , che punta a macvim , è stato creato e inserito in /usr/local/bin da brew, questo comportamento ha senso. Quello che non capisco è perché il PATH viene letto così com'è.

Soluzioni che ho provato:

  • Ho ovviamente riavviato la mia macchina.

EDIT (come richiesto dal commento ora eliminato):

utilizzando sysctl user.cs_path nel terminale viene visualizzato:

user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin
    
posta FabulousGlobe 20.06.2016 - 19:59
fonte

2 risposte

7

Il processo loginwindow imposta l'ambiente di un utente. Imposta le variabili TMPDIR e PATH, consulta i servizi di directory e imposta SHELL HOME USER LOGNAME. PATH è impostato su /usr/bin:/bin:/usr/sbin:/sbin se non modificato da launchd (nelle versioni più attuali di OS X). Questa è la variabile PATH disponibile per i processi dell'utente se non modificata da quel particolare processo ( cron come esempio imposta PATH su /bin:/usr/bin ).

Le applicazioni di emulazione di terminale avviano la shell come shell di login, quindi il PATH viene modificato leggendo il file di avvio della shell. Qualsiasi processo avviato dalla shell ora eredita la nuova variabile PATH. Altre applicazioni che usano una shell non leggono alcun file di configurazione della shell e usano quelle variabili d'ambiente disponibili nell'ambiente corrente. Un'applicazione può modificare l'ambiente utilizzando la chiave LSEnvironment nel loro Info.plist .

A partire da Yosemite, puoi modificare la variabile PATH nel seguente modulo.

sudo launchctl config user path <path>

nel tuo caso vuoi / usr / local / bin nella parte anteriore del percorso.

sudo launchctl config user path /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

reboot del tuo sistema e il nuovo PATH sarà impostato da loginwindow .

    
risposta data 26.06.2016 - 18:55
fonte
-1

Esegui questo:

launchctl setenv PATH "$PATH"

EDIT : non funziona più. Usalo invece con Bash:

CURRENT="$(/usr/libexec/PlistBuddy -c "Print PATH" ~/.MacOSX/environment.plist)"
/usr/libexec/PlistBuddy -c "Set PATH $CURRENT:/your/path/here:/another/path/maybe" ~/.MacOSX/environment.plist

Quindi disconnettiti e accedi di nuovo.

Nota : potresti voler sostituire $CURRENT:/your/path/here:/another/path/maybe con solo una lista di percorsi come :/your/path/here:/another/path/maybe , ma questa è una cattiva idea perché cancellerà tutti i percorsi già memorizzati.

Questo utilizza Variabili di ambiente sessione utente .

    
risposta data 20.06.2016 - 21:42
fonte

Leggi altre domande sui tag