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

Mi ~/etc/pathapariencia es la siguiente:

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

El problema:

Cuando escribo echo $PATHen la terminal, me devuelve:

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

Y esto persiste para cada aplicación iniciada en la terminal. Por ejemplo, si escribo emacsy luego hago:

M-x getenv PATH

Mi salida es:

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

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

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

Otro ejemplo:

Uso un complemento de Firefox llamado vimperator que emula la funcionalidad vim en Firefox. Tiene una función que permite al usuario editar la entrada de la página web en vim. Sin embargo, esto no parece funcionar en OS X. Por una corazonada, escribo el comando !echo $PATHen 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 /usr/local/binpor brew, este comportamiento tiene sentido. Lo que no entiendo es por qué PATHse lee así.

Soluciones que he probado:

  • Obviamente he reiniciado mi máquina.

EDITAR (como lo solicitó el comentario ahora eliminado):

usando sysctl user.cs_pathen la terminal aparece:

user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin
@fd0 Claro. He terminado, y este es el camino exacto que he estado obteniendo.

Respuestas (2)

El loginwindowproceso establece el entorno de un usuario. Establece las variables TMPDIR y PATH, consulta los Servicios de Directorio y configura SHELL HOME USER LOGNAME. PATH se establece en a /usr/bin:/bin:/usr/sbin:/sbinmenos 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 ( croncomo ejemplo, establece PATH en /bin:/usr/bin).

Las aplicaciones de emulador de terminal inician su shell como un shell de inicio de sesión, por lo que 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 usan un shell no leen ningún archivo de configuración del shell y usan las variables de entorno disponibles en el entorno actual. Una aplicación puede modificar el entorno utilizando la LSEnvironmentclave en su archivo Info.plist.

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

sudo launchctl config user path <path>

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

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

rebootsu sistema y la nueva RUTA serán establecidas por loginwindow.

¿Esto todavía funciona en Big Sur / Monterey? Estoy teniendo problemas para que tenga algún efecto.

Ejecuta esto:

launchctl setenv PATH "$PATH"

EDITAR : Eso ya no funciona. Use 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/maybesolo con una lista de rutas como :/your/path/here:/another/path/maybe, pero esa es una mala idea porque borrará todas las rutas ya almacenadas.

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

Intenté simplemente ejecutar el comando y agregarlo a mi .profile y .bash_profile. La RUTA todavía está configurada /usr/bin:/bin:/usr/sbin:/sbinen Eclipse, Vimperator (firefox) y Emacs. Lo extraño es que, si uso la opción para ejecutar un script de shell en Emacs o Vimperator, la ejecución echo $PATHme da /usr/bin:/bin:/usr/sbin:/sbin. Sin embargo, ejecutar launchctl getenv PATHproduce /usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; No sé cómo ejecutar un script de shell en Eclipse. Reinicié después de hacer los cambios en mis archivos de puntos, por supuesto.
Esto también es lo que se muestra si escribo echo $PATHen la terminal.
¿Qué se supone que debe hacer exactamente ese comando?
@Allan También me encontré con ese comando mientras buscaba respuestas en Google. Aparentemente solía establecer variables ambientales en 10.8. Ahora no funciona.
Se suponía que el comando notificaría a launchctl sobre la nueva PATHvariable, pero aparentemente eso ya no funciona. Actualicé mi respuesta con una nueva solución.