He leído una docena de respuestas diferentes y he hablado con muchas personas y tengo dificultades para entender cómo se calcula PATH en diferentes escenarios. Específicamente estoy pensando en
Además, ahora estoy en High Sierra, pero veo que algunas personas mencionaron que esto cambió en algún momento.
He visto esta respuesta y esta , pero ambas parecen estar enfocadas explícitamente en lo que sucede dentro de bash.
Voy a agrupar 1 y 2 porque todos los shells leen archivos al inicio.
PATH se hereda de su proceso padre. Este es un concepto clave que debe comprender.
El PATH primero está codificado en el kernel:
sysctl user.cs_path
user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin
launchd que actúa como init
puede configurarse para cambiar esta RUTA. Generalmente no se cambia.
El loginwindow.app configurará un entorno cuando inicie sesión en su computadora. Se verificará que PATH se haya establecido o se establecerá en la ruta codificada en el kernel o en una ruta modificada establecida por launchd. Es como si loginwindow.app estuviera llamando login -pf <username>
.
En este punto, un usuario LaunchAgent o LaunchDaemon puede modificar la RUTA.
Esta será la RUTA disponible para las aplicaciones GUI desde el Finder. (Las primeras versiones de OS X podían usar ~/.MacOSX/environment.plist para cambiar la RUTA de las aplicaciones GUI). Ahora bien, si esto parece complicado, no lo es y más que probable, como yo, el PATH disponible es/usr/bin:/bin:/usr/sbin:/sbin
Cuando inicia Terminal.app, primero llama login
(login -pf ), lo que activa su shell para que se trate como un shell de inicio de sesión. Se leen los archivos apropiados en /etc y su carpeta HOME. Ahora, la RUTA debe ser diferente a la establecida por loginwindow.app. ¿Recuerdas que hablamos de la herencia? Si inicia una aplicación GUI desde su sesión de terminal, la RUTA disponible para la aplicación GUI será la misma que la establecida por el shell.
En cuanto a los demonios, normalmente se inician por su ruta absoluta.
Desde la página man para PATH ( man path
):
La ruta de búsqueda de comandos. Es una lista de directorios separados por dos puntos en los que el shell busca comandos (consulte EJECUCIÓN DE COMANDOS a continuación).... La ruta predeterminada depende del sistema y la establece el administrador que instala bash. Un valor común es ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin''.
Entonces, a partir de eso, excepto de la página de manual de bash, vemos que la ruta de bash es (inicialmente):
La ruta puede (obviamente) ser modificada. Hay varios lugares donde se puede establecer la variable de entorno PATH:
~/.bashrc
~/.bash_profile
En macOS, el archivo /etc/paths
se usa para configurar las rutas de búsqueda:
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
Además, la ruta es configurada inicialmente por la /usr/libexec/path_helper
utilidad que crea una ruta basada en el contenido de/etc/paths.d
Se llama desde /etc/profile
el cual establece el perfil bash de todo el sistema (los individuales se configuran en ~/.profile
)
En cuanto a las aplicaciones GUI, la ruta del shell realmente no tiene ningún efecto. La única vez que una aplicación GUI (Cocoa, Quartz, Metal) tiene algo que ver con PATH es cuando abre un shell (ya sea interactivo o no interactivo). En ese momento, utilizará el entorno PATH tal como está establecido o realizará los cambios que necesite en tiempo de ejecución.
Cada uno de los shells tiene un perfil diferente en todo el sistema (al igual que bash) que establece la RUTA inicial (llamando a la path_helper
utilidad)
/etc/zprofile
/etc/profile
/etc/csh.login
system attribute PATH
o algo en AppleScript, ¿verdad? El valor que veo allí... ¿de dónde viene? ¿Qué serie de pasos siguió el sistema operativo para configurarlo?Todos: comprendan que Apple ha cambiado el paradigma de rutas con el tiempo en Sierra (consulte https://lluad.com/blog/os-x-system-path/ ), HighSierra y Mojave. Path_helper ahora funciona de manera algo diferente, parece porque me ha bloqueado las ventanas de la terminal que puedo liberar y funciona bien comentando
# if [ -x /usr/libexec/path_helper ]; then
# eval `/usr/libexec/path_helper -s`
# fi
en /etc/profile
.
Tengo secuencias de comandos que corrigen la ruta porque tengo varias herramientas funcionando (el núcleo de ellas está instalado por Homebrew, pero eso es solo alrededor de 15 de las 25 que uso todos los días) y estas deben configurarse para su uso en .app aplicaciones, en inicios de secuencias de comandos .sh y para inicio automático en secuencia de inicio protegida en Mojave. Es confuso, pero seguro que Mojave ha cambiado la estructura requerida y necesito mejorarla yo mismo.
Lo que esto significa para esta pregunta en particular es que la pregunta es pertinente en toda su amplitud y que debe ser respondida por desarrolladores que sintieron el dolor y arreglaron sus sistemas para Mojave, y también provienen de varios "mundos" como los IDE normales. , XCode, Eclipse, Bean, Intellij, etc. También, aquellos que dependen de homebrew stacks, o mamp stacks, etc. Y para aquellos que están trabajando con docker, .node, vm, etc., y otras herramientas más profundas. A medida que Apple implemente una mayor seguridad, nuestras cosas se estropearán, pero me alegro de que Apple esté haciendo su trabajo. Necesitamos hacer lo nuestro, por lo que necesitamos gente de vanguardia para transmitir la nueva sabiduría. Los artículos que tienen 6 meses o más nos van a confundir.
Alano
Jorge Mauer
.bash_profile
por ejemplo, porque en el momento en que se ejecuta, PATH ya tiene cosas (es por eso que agregamos al frente o al final). Se calcula considerando alguna secuencia de fuentes y ejecutando alguna secuencia de scripts, pero ¿ cuáles son esos ?usuario3439894
Jorge Mauer
Harald Hanche-Olsen
path_helper
para ayudar a establecer la variable PATH. Echa un vistazo a su página de manual; encontrará que leen/etc/paths
y/etc/paths.d/*
por los contenidos. Se aconseja a los usuarios de otros shells que adapten este método; de esa manera, todos los shells obtienen la misma RUTA.