In OSX Yosemite, perché posso impostare molte variabili d'ambiente per le app GUI, ma non posso impostare la variabile specifica PATH

16

Dopo che ho avuto risolto i problemi di PATH OSX fino alla versione di Mavericks, i problemi tornano in Yosemite !!!

Quindi voglio imitare la vecchia funzionalità launch.conf nella nuova versione di Yosemite per Mac OSX 10.10, in modo da avere la variabile d'ambiente PATH nelle app della GUI come Carbon Emacs o RStudio disponibili. Ho utilizzato la grande idea di utente stackoverflow ursa per impostare uno script di shell che configura le variabili di ambiente tramite launchctl . (Vedi la sua risposta StackOverflow qui .) Funziona per la maggior parte delle variabili d'ambiente, ma non per la variabile PATH .

1. Che cosa ho fatto?

Per prima cosa ho scritto lo script /etc/environment.rc simile al seguente:

launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"

Poi ho creato i plists per launchd (elenchi di questi e di altri script citati nell'appendice in basso). Quindi li ho attivati con

$ sudo launchctrl load ...

Quindi ho disabilitato l'utilità path_helper nel profilo di shell% file /etc/ , in modo che non sovrascriva le impostazioni di environment.rc . E finalmente ho riavviato la macchina.

2. Qual è l'effetto?

Quando avvio Terminal, le nuove variabili di ambiente JAVA_HOME e ENVIRONMENT_RC sono impostate in base a environment.rc , ma PATH è impostato su

/ usr / bin: / bin

Per essere sicuri, nessun file init di bash ha avuto il modo in cui ho scritto un piccolo script python invece (anche nell'appendice) per mostrare le variabili nell'ambiente corrente e lo eseguo direttamente facendo doppio clic su ornitorinco . Anche in questo caso vengono impostate le nuove variabili, mentre PATH ha l'impostazione predefinita di sistema.

Allora perché posso impostare altre variabili, ma non la variabile PATH? E come posso risolvere questo in modo unificato ?

Aggiornamento:

La situazione è molto sconcertante: la shell ( bash almeno) in Terminal o Emacs raccoglierà il PATH impostato con launchctl , ma altre app della GUI non lo faranno., ad es. lo script python minimale menzionato direttamente tramite Platypus non mostrerà il tuo percorso personalizzato. Ed anche Emacs stesso non conosce il PERCORSO corretto: lo noti per es. quando si emette il comando Emacs M-x ispell-buffer ; lo strumento unix ispell che emacs prova a chiamare non verrà trovato se si trova solo sul tuo percorso personalizzato.

Appendice

net.halloleo.environment.plist , il file di configurazione di launchd in /Library/LaunchDaemons/ :

<?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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

net.halloleo.environment-user.plist , il file di configurazione di launchd 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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment-user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

/etc/profile , il file di avvio di bash modificato:

# System-wide .profile for sh(1)

# if [ -x /usr/libexec/path_helper ]; then
#   eval '/usr/libexec/path_helper -s'
# fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

show_environ.py , lo script che mostra tutte le variabili di ambiente:

import os
print (os.environ)
    
posta halloleo 28.10.2014 - 11:05
fonte

3 risposte

3

PATH in Yosemite può e deve essere impostato nel file / etc / paths. Aggiungi il tuo percorso alla fine di questo file:

/usr/bin
/bin
/your/custom/path

/ etc / environment script in post originale fornisce supporto per variabile PATH in applicazioni GUI (testato con Emacs).

    
risposta data 28.10.2014 - 11:15
fonte
2

Questo mi ha lasciato perplesso per molto tempo (beh, l'ultimo paio di ore). Alla fine mi sono imbattuto in questo bug report, che sembra descrivere esattamente il mio problema (non sono sicuro di quale estensione sia correlato al tuo problema, ma sembra esserci un bug in Yosemite / launchd in combinazione con PATH e script come come python:

link

La soluzione sembra essere quella di avviare uno script di shell che poi avvia Python. Non proprio quello che mi piace, ma è così ...

    
risposta data 18.12.2014 - 18:59
fonte
1

Il problema è che launchd aggiunge un'altra variabile PATH invece di sostituire quella nell'ambiente. La maggior parte dei programmi utilizza getenv che restituisce sempre la prima occorrenza di una variabile, le shell invece eseguono un'iterazione attraverso tutte le variabili di ambiente e le importano come variabili locali sovrascrivendo in tal modo le istanze precedenti con l'ultima.

Questo è ovviamente un bug in launchd, le variabili di ambiente passate a un programma dovrebbero essere uniche.

    
risposta data 24.06.2015 - 18:39
fonte

Leggi altre domande sui tag