16 votos

En OSX Yosemite, ¿por qué no puedo establecer muchas variables de entorno para crear aplicaciones GUI, pero no se puede establecer la variable específica CAMINO

Después de que yo había resuelto OSX' RUTA de los problemas a los Mavericks de liberación, los problemas vienen de vuelta en Yosemite!!!

Así que me quieren imitar a los antiguos launch.conf característica en el nuevo Mac OSX 10.10 Yosemite liberación, con el fin de tener la variable de entorno PATH en la GUI de aplicaciones como de Carbono Emacs o RStudio disponible. He utilizado la gran idea de stackoverflow usuario ursa para configurar una secuencia de comandos de shell que configura las variables de entorno a través de la launchctl. (Véase 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í la /etc/environment.rc script parecida a:

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"

A continuación, he creado el plists para launchd (listados de estos y de otros scripts mencionados en el apéndice abajo). Luego he activado con

$ sudo launchctrl load ...

A continuación, he desactivado el path_helper de utilidad en el shell de archivo init /etc/el perfil, de modo que no se sobrescribe el environment.rc configuración. Y por último me reinicia la máquina.

2. Cuál es el efecto?

Al iniciar el Terminal de las nuevas variables de entorno JAVA_HOME y ENVIRONMENT_RC se establecen de acuerdo a environment.rc, pero se establece la RUTA a

/usr/bin:/bin

Con el fin de asegurarse de que, no bash archivo init puso en el camino que escribí un pequeño script en python en su lugar (en el apéndice) para mostrar las variables en el entorno actual y que ejecuto esta directamente haciendo doble clic en un Ornitorrinco contenedor. De nuevo en esta se establecen las variables, mientras que la RUTA por defecto del sistema.

Así que ¿por qué no puedo establecer otras variables, pero no la variable PATH? Y ¿cómo puedo solucionar esto de una forma unificada?

Actualización:

La situación es muy desconcertante: La cáscara (bash al menos) en la Terminal o en Emacs recogerá la RUTA de acceso se establece a través de la launchctl, pero otras GUI de aplicaciones no hacerlo., por ejemplo, el mencionado mínimo secuencia de comandos de python recta se llama a través de Ornitorrinco no mostrar su ruta de acceso personalizada. E incluso Emacs mismo no conoce la RUTA de acceso correcta: esto Se nota por ejemplo, cuando se emite el comando Emacs M-x ispell-buffer; la de unix herramienta ispell que emacs intenta llamar no se si es solo en tu ruta personalizada.


Apéndice

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

# 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, la secuencia de comandos de visualización de todas las variables de entorno:

import os
print (os.environ)

3voto

ursa Puntos 147

RUTA en Yosemite puede y se debe establecer dentro de /etc/rutas de acceso de archivo. Sólo tiene que añadir su camino a la final de este archivo:

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

/etc/environment secuencia de comandos en el post original proporciona apoyo para la variable de RUTA de acceso en las aplicaciones GUI (probado con Emacs).

2voto

Claude Puntos 131

Esto me desconcertó por un largo tiempo (bueno, el último par de horas). Al final me encontré con este informe de error, que se parece exactamente a describir mi problema (no estoy seguro de en qué medida se relaciona con su problema, pero parece que hay un error en Yosemite/launchd en combinación con la RUTA de acceso y secuencias de comandos, tales como python:

http://www.openradar.me/18945659

La solución parece ser la de iniciar un shell script que inicia el python. No se realmente lo que me gusta, pero es la manera que es....

1voto

StenSoft Puntos 111

El problema es que launchd añade otra variable PATH en lugar de sustituir el uno en el medio ambiente. La mayoría de los programas de uso getenv que siempre devuelve la primera ocurrencia de una variable, conchas, en lugar de iterar a través de todas las variables de entorno y de importación como las variables locales, por lo tanto, sobrescribir las instancias anteriores con la última.

Esta es, obviamente, un error en launchd, variables de entorno se pasa a un programa debe ser único.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X