En OSX Yosemite, ¿por qué puedo configurar muchas variables de entorno para aplicaciones GUI, pero no puedo configurar la variable específica PATH?

Después de haber solucionado los problemas de OSX' PATH hasta el lanzamiento de Mavericks, ¡¡¡los problemas vuelven en Yosemite!!!

Así que quiero imitar la launch.conffunción anterior en la nueva versión de Mac OSX 10.10 Yosemite, para tener disponible la variable de entorno PATH en aplicaciones GUI como Carbon Emacs o RStudio . Utilicé la gran idea del usuario ursa de stackoverflow para configurar un script de shell que configura las variables de entorno a través de launchctl. (Vea su respuesta de stackoverflow aquí ). Esto funciona para la mayoría de las variables de entorno, pero no para la variable PATH .

1. ¿Qué he hecho?

Primero escribí el /etc/environment.rcguión luciendo así:

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"

Luego creé las listas para launchd(listados de estos y de otros scripts mencionados en el apéndice a continuación). Luego los activé con

$ sudo launchctrl load ...

Luego deshabilité la path_helperutilidad en el perfil de archivo de inicio de shell /etc/, para que no sobrescriba la environment.rcconfiguración. Y finalmente reinicié la máquina.

2. ¿Cuál es el efecto?

Cuando inicio Terminal, las nuevas variables JAVA_HOMEde entorno ENVIRONMENT_RCestán configuradas de acuerdo con environment.rc, pero PATH está configurado en

/usr/bin:/bin

Para asegurarme, ningún basharchivo de inicio se interpuso en la forma en que escribí un pequeño script de python (también en el apéndice) para mostrar las variables en el entorno actual y lo ejecuto directamente haciendo doble clic en un contenedor de Platypus . Nuevamente se establecen las nuevas variables, mientras que PATH tiene el valor predeterminado del sistema.

Entonces, ¿por qué puedo configurar otras variables, pero no la variable PATH? ¿Y cómo puedo resolver esto de una manera unificada ?

Actualizar:

La situación es muy desconcertante: el shell ( bashal menos) en Terminal o Emacs tomará la RUTA que establezca a través launchctlde , pero otras aplicaciones de GUI no lo harán. camino. E incluso Emacs en sí mismo no conoce la RUTA correcta: lo nota, por ejemplo, cuando ejecuta el comando Emacs M-x ispell-buffer; la herramienta Unix a la ispellque emacs intenta llamar no se encontrará si solo está en su ruta personalizada.


Apéndice

net.halloleo.environment.plist, el archivo de configuración de launchd en /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, el archivo de configuración de launchd en /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, el archivo de inicio bash modificado:

# 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, el script que muestra todas las variables de entorno:

import os
print (os.environ)

Respuestas (3)

PATH en Yosemite puede y debe establecerse dentro del archivo /etc/paths. Simplemente agregue su ruta al final de este archivo:

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

El script /etc/environment en la publicación original brinda soporte para la variable PATH en aplicaciones GUI (probado con Emacs).

Esto solo funciona para shells que llaman /usr/libexec/path_helperdurante su proceso de inicialización. Las aplicaciones GUI no obtienen la RUTA de acuerdo con /etc/paths, y pregunté específicamente sobre las aplicaciones GUI.
Actualicé la respuesta y el script /etc/environment en la publicación original
Estas son dos respuestas, ¿cuál está dando? También el OP dice que /etc/environment no funciona
@mark (1) después de que se planteó esta pregunta, actualicé /etc/environment, y ahora es compatible con PATH. (2) la respuesta aquí es usar /etc/paths
Lo siento, ursa, para mí, incluso si uso /etc/environmenten lugar de /etc/environment.rc(como nombre de archivo y referenciado en los plists), la RUTA en el entorno de la GUI iniciada sigue siendo /usr/bin:/bin. En Carbon Emacs, iniciado mediante doble clic en el buscador (!) y sin un .emacsarchivo, verifique el valor de exec-patho process-environment.
está bien. intente en los pasos: (1) en la llamada de terminal "launchctl setenv PATH /your/custom/path:/bin:/usr/bin" (2) reinicie la aplicación Dock "osascript -e 'dile a la aplicación "Dock" que salga'" ( 3) inicie Emacs con el menú Spotlight (4) > Herramientas > Comando Shell > echo $PATH. que imprime
Trabajó para mi. sudo vim /etc/pathsluego reinicie y funcionó muy bien. Gracias.
@ursa Perdón por mi respuesta tardía. Cuando realizo los cuatro pasos que sugiere, obtengo el resultado que menciona, pero esto no significa que la RUTA en el entorno de Emacs esté configurada correctamente, solo muestra que el shell iniciado shell-commandobtiene la RUTA correcta. Es una situación muy desconcertante. Actualizaré la pregunta con estos detalles.
@halloleo, eso es lo que esperaría: el comando de shell en Emacs inicia un nuevo shell y ese shell lee /etc/path y .bashrc, etc., pero Emacs en sí no se llama a través del mecanismo de shell
@mark Sí, y ese es exactamente mi punto, problema y pregunta: ¿Cómo puedo configurar la variable de entorno PATH de las aplicaciones GUI cuando se inician a través del Finder? Aún así, no hay una solución general real para esto a la vista...

Esto me desconcertó durante mucho tiempo (bueno, el último par de horas). Al final me encontré con este informe de error, que parece describir exactamente mi problema (no estoy seguro de hasta qué punto está relacionado con su problema, pero parece haber un error en Yosemite/launchd en combinación con PATH y scripts como como pitón:

http://www.openradar.me/18945659

La solución parece ser iniciar un script de shell que luego inicia python. Realmente no es lo que me gusta, pero es como es....

Gracias por el enlace al informe de error. Bueno, ahora es un error real. Encontré otro embrague a su alrededor; Lo publicaré aquí.

El problema es que launchd agrega otra variable PATH en lugar de reemplazar la del entorno. La mayoría de los programas usan getenvque siempre devuelve la primera aparición de una variable, los shells en su lugar iteran a través de todas las variables de entorno y las importan como variables locales, sobrescribiendo así las instancias anteriores con la última.

Obviamente, esto es un error en launchd, las variables de entorno que se pasan a un programa deben ser únicas.

Respuesta de fondo genial! Supongo que no hay una forma real de evitarlo en conchas, ¿o sí?
@halloleo Puede iniciar el comando que sh -c 'YOUR ORIGINAL COMMAND'lo pasa a través de Shell, eligiendo el PATHconjunto en launchd.