¿Cómo se calcula exactamente PATH?

1

He leído una docena de respuestas diferentes y he hablado con un grupo de personas y me cuesta entender cómo se calcula PATH en diferentes escenarios. Específicamente estoy pensando en

  1. ¿Cómo se calcula exactamente PATH para bash?
  2. ¿Cómo se calcula exactamente para otras conchas? (Supongo que es dependiente de la concha, pero ¿cuál es la coincidencia entre todas las conchas?)
  3. ¿Cómo se calcula exactamente para las aplicaciones GUI?
  4. ¿Me estoy perdiendo otra forma de lanzar cosas? ¿Los demonios hacen algo diferente? (¿No lo creo? Pero quizás ...)

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 éste pero ambos parecen estar enfocados explícitamente en lo que sucede dentro de bash.

    
pregunta George Mauer 31.08.2018 - 16:29

2 respuestas

2

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

PATH se hereda de su proceso padre. Este es un concepto clave que necesita comprender.

El PATH se codifica primero en el núcleo:

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

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

El loginwindow.app configurará un entorno cuando inicies sesión en tu computadora. Se comprobará que PATH se haya configurado o se configurará en la ruta codificada en el núcleo o en una ruta modificada establecida por launchd. Es como si loginwindow.app está llamando 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 del Finder. (Las primeras versiones de OS X podrían usar ~ / .MacOSX / environment.plist para cambiar el PATH para las aplicaciones GUI). Ahora, si esto parece complicado, no lo es y es más probable, como yo, el PATH disponible es /usr/bin:/bin:/usr/sbin:/sbin

Cuando inicia Terminal.app, primero llama a login (login -pf), lo que hace que su shell sea tratado como un shell de inicio de sesión. Se leen los archivos apropiados en / etc y su carpeta HOME. Ahora, PATH debe ser diferente de lo establecido por loginwindow.app. ¿Recuerdas que hablamos de herencia? Si 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, generalmente se inician por su ruta absoluta.

    
respondido por el fd0 31.08.2018 - 18:23
2

Desde la página del manual de PATH ( man path ):

  

La ruta de búsqueda para los comandos. Es una lista separada por dos puntos de   directorios en los que el shell busca comandos (ver COMANDO   EJECUCIÓN a continuación) .... La ruta predeterminada depende del sistema, y está establecida por   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 en la página de manual de bash, vemos que la ruta de bash es (inicialmente):

  • dependiente del sistema y no dependiente de la shell
  • establecido por el que instaló bash (en este caso Apple)
  • tiene un valor predeterminado

La ruta puede (obviamente) ser modificada. Hay varios lugares donde se puede configurar 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 se configura inicialmente con la utilidad /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 de bash en 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 una shell (ya sea interactiva o no interactiva). En ese momento, utilizará el entorno PATH como se establece o realizará los cambios que necesite en el tiempo de ejecución.

Diferentes shells

Cada uno de los shells tiene un perfil diferente del sistema (como lo hace bash) que establece el PATH inicial (llamando a la utilidad path_helper )

  • Zsh = /etc/zprilfe
  • Ksh = /etc/profile
  • Csh = /etc/csh.login
respondido por el Allan 31.08.2018 - 16:50

Lea otras preguntas en las etiquetas