3 votos

¿Cómo se calcula exactamente el PATH?

He leído una docena de respuestas diferentes y he hablado con un montón de gente y estoy teniendo dificultades para entender cómo se calcula el PATH en diferentes escenarios. En concreto, estoy pensando en

  1. ¿Cómo se calcula exactamente el PATH para bash?
  2. ¿Cómo se calcula exactamente para otras cáscaras? (Supongo que depende de la cáscara, pero ¿qué es lo que tienen en común todas las cáscaras?)
  3. ¿Cómo se calcula exactamente para las aplicaciones GUI?
  4. ¿Me estoy perdiendo otra forma de lanzar cosas? ¿Los demonios hacen algo diferente? (Creo que no, pero tal vez...)

Adicionalmente estoy en High Sierra ahora pero estoy viendo que algunas personas mencionaron que esto cambió en algún momento?

He visto esta respuesta y este pero ambos parecen centrarse explícitamente en lo que ocurre dentro de bash.

1 votos

¿Qué quiere decir con la frase "cómo es PATH calculado ?. Es una variable de entorno que se establece

0 votos

@Allan sí, pero ¿cómo se fija exactamente? No es sólo .bash_profile por ejemplo, porque en el momento en que se ejecuta, PATH ya tiene cosas en él (por eso añadimos al principio o al final). Se calcula considerando alguna secuencia de fuentes y ejecutando alguna secuencia de scripts pero qué son esos ?

1 votos

Voto por cerrar esta pregunta por ser demasiado amplia. Por favor, edite la pregunta para limitarla a un problema específico con suficiente detalle para identificar una respuesta adecuada. Evite hacer varias preguntas distintas a la vez.

7voto

Michael Zhou Puntos 167

Voy a agrupar la 1 y la 2 porque todos los shells leen archivos al inicio.

PATH se hereda de su proceso padre. Este es un concepto clave que debes entender.

El PATH se codifica primero en el kernel:

sysctl user.cs_path
user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin

launchd que actúa como init puede ser configurado para cambiar este PATH. Generalmente no se cambia.

La aplicación loginwindow.app configurará un entorno cuando se inicie la sesión en el ordenador. Se comprobará que PATH ha sido establecido o se establecerá la ruta codificada en el kernel o una ruta modificada establecida por launchd. Es como si loginwindow.app llamara a login -pf <username> .

En este punto, un usuario LaunchAgent o LaunchDaemon puede modificar el PATH.

Este será el PATH disponible para las aplicaciones GUI desde el Finder. (Las primeras versiones de OS X podían utilizar ~/.MacOSX/environment.plist para cambiar el PATH de las aplicaciones GUI). Ahora bien, si esto parece complicado, no lo es y lo más probable es que, como yo, el PATH disponible sea /usr/bin:/bin:/usr/sbin:/sbin

Cuando se inicia el Terminal.app, primero se llama a login (login -pf ) que hace que su shell sea tratado como un shell de acceso. Los archivos apropiados en /etc y su carpeta HOME son leídos. Ahora, el PATH debe ser diferente al establecido por el loginwindow.app. ¿Recuerdas que hablamos de la herencia? Si usted inicia una aplicación GUI desde su sesión de terminal entonces el PATH disponible para la aplicación GUI será el mismo que el establecido por el shell.

En cuanto a los demonios, normalmente se inician por su ruta absoluta.

0 votos

Gracias por explicar cómo encaja el launchd en todo esto. Nadie más podría decírmelo.

0 votos

El lanzamiento es un proceso más y funciona como todos los demás. Hereda un entorno y establece un entorno para los procesos que bifurca.

6voto

Douglas Puntos 10417

De la página man de PATH ( man path ):

La ruta de búsqueda de los comandos. Es una lista separada por dos puntos de directorios en los que el shell busca los comandos (véase COMANDO EJECUCIÓN más adelante).... La ruta por defecto depende del sistema, y se establece mediante la opción administrador que instala bash. Un valor común es ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin''.

Así que, a partir de eso, excepto de la página man de bash, vemos que la ruta de bash es (inicialmente):

  • dependiente del sistema y no del shell
  • establecido por quien instaló bash (en este caso Apple)
  • tiene un valor por defecto

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 utiliza para configurar las rutas de búsqueda:

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

Además, la ruta está configurada inicialmente por el /usr/libexec/path_helper que creará una ruta basada en el contenido de /etc/paths.d

Se llama desde /etc/profile que establece el perfil bash de todo el sistema (los individuales se establecen en ~/.profile )

En cuanto a las aplicaciones de la interfaz gráfica de usuario, la ruta del shell 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). En ese momento utilizará el entorno PATH tal y como está establecido o hará los cambios que necesite en tiempo de ejecución.

Diferentes conchas

Cada uno de los shells tiene un perfil diferente para todo el sistema (al igual que bash) que establece el PATH inicial (llamando al path_helper utilidad)

  • Zsh = /etc/zprilfe
  • Ksh = /etc/profile
  • Csh = /etc/csh.login

0 votos

Sí, pero no todo se lanza a través de bash, ¿verdad? Si ejecuto eshell en emacs o korn shell entonces no va a pasar por el mismo proceso. Me doy cuenta de que va a ser diferente por shell, pero es totalmente diferentes o el SO proporciona una "base común de inicialización"? ¿Qué pasa con las aplicaciones lanzadas a través de Spotlight? ¿Cómo se calcula el PATH que ven?

0 votos

La terminología es importante - el camino no lo es calculado. Ya está puesto. Estás confundiendo el SO con el shell. Un shell no es más que un entorno para ejecutar comandos en un SO.

0 votos

Me parece justo Allan, aunque no sé qué otro término utilizar. La ruta está efectivamente establecida (desde el punto de vista de los scripts) pero desde el punto de vista de una aplicación que podría usar el PATH, hubo una serie de pasos que se hicieron para producir la variable env de PATH actual. En cuanto a las aplicaciones de la GUI, que no utilicen el PATH es diferente a que no esté disponible. Usted puede hacer system attribute PATH o algo en AppleScript, ¿verdad? El valor que veo ahí... ¿de dónde sale? ¿Qué serie de pasos ha seguido el sistema operativo para establecerlo?

0voto

Dennis Puntos 11

Todos: Por favor, entiendan que Apple ha cambiado el paradigma de las rutas con el tiempo en Sierra (ver https://lluad.com/blog/os-x-system-path/ ) , HighSierra y Mojave. Path_helper ahora funciona algo diferente parece porque me ha bloqueado el terminal Windows que puedo liberar y tener funcionando bien comentando

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
#  fi

en /etc/profile .

Tengo scripts que fijan la ruta porque tengo varias herramientas funcionando, (el núcleo de ellas está instalado por Homebrew, pero eso es sólo unos 15 de los 25 que uso cada día) y estos tienen que ser establecidos para su uso en aplicaciones .app, en los arranques .sh scriptsscriptscripts, y para el autolaunch en la secuencia de arranque protegida bajo Mojave. Es confuso, pero seguro que Mojave ha cambiado la estructura requerida y tengo que intensificarla yo mismo.

Lo que esto significa para esta pregunta en particular es que la pregunta es pertinente en toda su amplitud y que necesita ser respondida por los desarrolladores que han sentido el dolor y han arreglado sus sistemas para Mojave, y también provienen de los diversos "mundos" como los IDE normales, XCode, Eclipse, Bean, Intellij, etc. También los que dependen de stacks homebrew, o mamp stacks, etc. Y para los que hacen trabajos de docker, .node, vm, etc., y otras herramientas más profundas. A medida que Apple implementa una mayor seguridad nuestras cosas se van a romper, pero me alegro de que Apple esté haciendo su trabajo. Nosotros tenemos que hacer el nuestro, así que necesitamos gente de vanguardia que transmita la nueva sabiduría. Los artículos que tienen 6 o más meses de antigüedad sólo van a confundirnos.

0 votos

Por alguna razón, esto no parece responder a la pregunta anterior. Si la respuesta está en la página que enlazaste, por favor resúmela directamente en tu post (y quizás acorta los párrafos posteriores). Además, no se limite a mencionar que hace las cosas de forma diferente, sino que explique/muestre Mostrar cómo hacerlo.

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