Establezca la variable PATH para que se detecte en todas las aplicaciones, incluso fuera del terminal. (El Capitán)

6

Mi ~/etc/path se ve como sigue:

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

El problema:

Cuando escribo echo $PATH en la terminal, vuelvo:

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

Y esto persiste para todas las aplicaciones iniciadas en el terminal. Por ejemplo, si escribo emacs , y luego hago:

M-x getenv PATH

Mi salida es:

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

Sin embargo, si inicio emacs utilizando launchpad en lugar de terminal y una vez más ingrese M-x getenv PATH , mi salida es /usr/bin:/bin:/usr/sbin:/sbin .

Como puede ver, mi cambio a ~/etc/path , que fue la adición de /usr/local/bin , falta.

Otro ejemplo:

Uso un complemento de Firefox llamado vimperator que emula la funcionalidad de vim en Firefox. Tiene una característica que permite al usuario editar la entrada de la página web en vim. Sin embargo, esto no parece funcionar en OS X. En una corazonada escribo el comando !echo $PATH en vimperator y veo lo siguiente: /usr/bin:/bin:/usr/sbin:/sbin . Por supuesto, dado que el enlace simbólico llamado gvim , que apunta a macvim , fue creado y colocado en /usr/local/bin por brew, este comportamiento tiene sentido. Lo que no entiendo es por qué el PATH se lee como está.

Soluciones que he probado:

  • Obviamente he reiniciado mi máquina.

EDITAR (según lo solicitado por el comentario ahora eliminado):

usando sysctl user.cs_path en el terminal aparece:

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

2 respuestas

7

El proceso loginwindow establece el entorno de un usuario. Establece las variables TMPDIR y PATH, consulta los servicios de directorio y establece SHELL HOME USER LOGNAME. PATH se establece en /usr/bin:/bin:/usr/sbin:/sbin a menos que sea modificado por launchd (en las versiones más actuales de OS X). Esta es la variable PATH disponible para los procesos del usuario, a menos que sea modificada por ese proceso en particular ( cron como ejemplo establece el PATH en /bin:/usr/bin ).

Las aplicaciones de emulador de terminal inician su shell como shell de inicio de sesión, por lo tanto, la ruta se modifica al leer los distintos archivos de inicio de shell. Cualquier proceso iniciado por su shell ahora hereda la nueva variable PATH. Otras aplicaciones que utilizan un shell no leen ningún archivo de configuración de shell y utilizan las variables de entorno disponibles en el entorno actual. Una aplicación puede modificar el entorno utilizando la clave LSEnvironment en su Info.plist .

A partir de Yosemite, puede cambiar la variable PATH de la siguiente forma.

sudo launchctl config user path <path>

en su caso, usted quiere / usr / local / bin al frente de la ruta.

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

reboot su sistema y el nuevo PATH se establecerá en loginwindow .

    
respondido por el fd0 26.06.2016 - 18:55
-1

Ejecuta esto:

launchctl setenv PATH "$PATH"

EDIT : Eso ya no funciona. Usa esto con Bash en su lugar:

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

Luego cierre sesión y vuelva a iniciar sesión.

Nota : es posible que desee reemplazar $CURRENT:/your/path/here:/another/path/maybe con solo una lista de rutas como :/your/path/here:/another/path/maybe , pero es una mala idea ya que borrará todas las rutas ya almacenadas.

Esto utiliza Variables de entorno de sesión de usuario .

    
respondido por el Coder256 20.06.2016 - 21:42

Lea otras preguntas en las etiquetas