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

16

Después de que solucionara los problemas de PATH de OSX hasta el lanzamiento de Mavericks, los problemas vuelven a aparecer en Yosemite !!!

Así que quiero imitar la antigua característica launch.conf en la nueva versión de Mac OSX 10.10 de Yosemite, para tener la variable de entorno PATH en aplicaciones GUI como Carbon Emacs o RStudio disponibles. Utilicé la gran idea del usuario de stackoverflow ursa para configurar un script de shell que configure las variables de entorno a través de launchctl . (Consulte 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 script /etc/environment.rc con el siguiente aspecto:

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 (listas de estos y otros scripts mencionados en el apéndice a continuación). Entonces los activé con

$ sudo launchctrl load ...

Luego deshabilité la utilidad path_helper en el archivo shell init /etc/ perfil, para que no sobrescriba la configuración de environment.rc . Y finalmente reinicié la máquina.

2. ¿Cuál es el efecto?

Cuando inicio Terminal, las nuevas variables de entorno JAVA_HOME y ENVIRONMENT_RC se configuran de acuerdo con environment.rc , pero PATH se establece en

/ usr / bin: / bin

Para estar seguro, no hay ningún archivo bash init en la forma en que escribí un pequeño script en Python (también en el apéndice) para mostrar las variables en el entorno actual y lo ejecuto directamente haciendo doble clic en Platypus envoltorio. 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 este de forma unificada ?

Actualización:

La situación es muy desconcertante: el shell ( bash al menos) en Terminal o Emacs recogerá el PATH que configuraste a través de launchctl , pero otras aplicaciones de GUI no lo harán. la secuencia de comandos de python mencionada directamente a través de Platypus no mostrará su ruta personalizada. E incluso Emacs en sí mismo no conoce la RUTA correcta: observa esto, por ejemplo. cuando emites el comando Emacs M-x ispell-buffer ; la herramienta de Unix ispell que emacs intenta llamar no se encontrará si está solo 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 de 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)
    
pregunta halloleo 28.10.2014 - 11:05

3 respuestas

3

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

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

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

    
respondido por el ursa 28.10.2014 - 11:15
2

Esto me desconcertó durante mucho tiempo (bueno, las últimas dos horas). Al final me encontré con este informe de error, que parece describir exactamente mi problema (no estoy seguro de qué extensión está relacionada con su problema, pero parece haber un error en Yosemite / launchd en combinación con PATH y scripts como como python:

enlace

La solución parece ser iniciar un script de shell que luego inicia el pitón. No es realmente lo que me gusta, pero es la forma en que está ...

    
respondido por el Claude 18.12.2014 - 18:59
1

El problema es que launchd agrega otra variable PATH en lugar de reemplazar la que está en el entorno. La mayoría de los programas utilizan getenv , que siempre devuelve la primera aparición de una variable, en su lugar, las tramas repiten todas las variables de entorno y las importan como variables locales, sobrescribiendo las instancias anteriores con la última.

Esto es obviamente un error en launchd, las variables de entorno pasadas a un programa deben ser únicas.

    
respondido por el StenSoft 24.06.2015 - 18:39

Lea otras preguntas en las etiquetas