Vista completa de dónde se establece la variable PATH en bash

17

He leído en un par de lugares que PATHestá configurado /etc/profileo el .profilearchivo que está en el directorio de inicio.

¿Son estos los únicos lugares en los que se establece el camino? Quiero una mejor comprensión de ello.

En el /etc/profilearchivo, como dice el siguiente comentario "system-wide .profile file for the Bourne shell". ¿Eso significa que los archivos de perfil son los principales archivos de configuración para bash?

En ese archivo no veo que PATHse establezca la var. En el .profilearchivo en el directorio de inicio hay esta línea:

PATH="$HOME/bin:$PATH"

Eso se restablece PATHpor el aspecto porque concatena la $PATHcadena ya establecida con el $HOME/bin:derecho? ¿Pero si etc/profiley ~/.profileson los únicos archivos de configuración de PATHdónde $PATHproviene esa línea de código si no está definida /etc/profile?

¿Alguien con experiencia puede dar una explicación amplia y detallada de la PATHvariable? ¡Gracias!

Larry Lawless
fuente

Respuestas:

20

Hay muchos lugares donde PATHse pueden configurar.

El loginprograma lo establece en un valor predeterminado. La forma en que se configura este valor predeterminado depende del sistema. En la mayoría de los sistemas Linux no integrados, se toma de /etc/login.defs, con diferentes valores para root y para otros usuarios. Consulte el login(1)manual de su sistema para averiguar qué hace.

En los sistemas que utilizan PAM , específicamente el pam_envmódulo, las variables de entorno se pueden establecer en el archivo de todo el sistema y el archivo /etc/environmentpor usuario ~/.pam_environment.

Luego, la mayoría de las formas de iniciar sesión (pero no los trabajos cron) ejecutan un shell de inicio de sesión que lee los archivos de configuración de todo el sistema y por usuario. Estos archivos pueden modificar el valor de PATH, generalmente para agregar entradas, pero a veces de otras maneras. Los archivos que se leen dependen de cuál sea el shell de inicio de sesión. Conchas de estilo Bourne / POSIX leídas /etc/profiley ~/.profile. Bash lee /etc/profile, pero para el archivo por usuario solo lee el primer archivo existente entre ~/.bash_profile, ~/.bash_loginy ~/.profile. Zsh lee /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zloginy ~/.zlogin. Muchas sesiones de GUI organizan la carga /etc/profiley ~/.profile, pero esto depende del administrador de pantalla, del entorno de escritorio u otro script de inicio de sesión, y de cómo cada distribución los ha configurado.

Gilles 'SO- deja de ser malvado'
fuente
4

La variable PATH inicial generalmente se establece en /etc/profile A veces, un administrador del sistema también colocará las variables PATH en la fuente/etc/profile.d

Estas son las variables PATH del sistema que todos los que inician sesión heredan de forma predeterminada (a menos que se anulen localmente). Esto generalmente establece rutas obvias, como /usr/bin, aunque en mi trabajo utilizamos /opty algunas ubicaciones personalizadas ampliamente, por lo que también se establecen allí.

En las cuentas de inicio de sesión por usuario, PATH también se puede definir en ~/.profile. Eso podría definir cosas a las que no todos los usuarios tienen acceso; tal vez los jefes de departamento pueden ejecutar archivos binarios, /optpero otros usuarios no se molestan con esos archivos binarios. Los usuarios también pueden modificar ese archivo, y lo bueno de esto .profilees que no es específico del shell; si inicia sesión, el camino establecido allí se obtiene.

Para los inicios de sesión shell-específicos, PATH se puede definir en ~/.bash_profile, ~/.bashrco .cshrc, o similar. Los usuarios pueden configurar PATH aquí si quieren rutas específicas para shells específicos, o si simplemente mantienen todas sus preferencias personales allí.

En resumen: / etc / profile y /etc/profile.d son configuraciones en cascada tradicionalmente; se heredan y generalmente se agregan a los archivos de puntos personales (aunque un usuario podría optar por anularlos). Los archivos de puntos personales generalmente los configura un usuario.

Por supuesto, un shell también tiene variables de entorno, por lo que una variable de entorno local también puede agregar o anular la RUTA predeterminada en cualquiera de los archivos de configuración.

Klaatu von Schlacker
fuente
Sin embargo, acabo de comprobar todos los archivos que mencionaste, ~ / .bash_profile y .cshrc no existen. Los 3 archivos de script en el directorio /etc/profile.d: appmenu-qt5.sh, bash_completion.sh & vte.sh tampoco configuran la variable PATH. ¿Qué quiere decir con "un shell también tiene variables de entorno" es la RUTA predeterminada establecida en el programa binario / bin / bash? Cuando terminal echo $ PATH obtengo: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games pero no tengo idea de dónde se está poniendo todo eso realmente.
Larry Lawless
Creo que de alguna manera leí mal tu pregunta, pensé que estabas preguntando por todas las ubicaciones en las que PATH podría establecerse, pero creo que estás más interesado en saber dónde se configura inicialmente PATH . Para eso, mira /etc/bashrc. Esto determina cómo se inicia BASH, que debe incluir todas las variables de entorno iniciales. En mi sistema, /etc/bashrclee desde /etc/profile.dpero parece que solo tiene 3 archivos, por /etc/profile.dlo que su distribución puede hacerlo de manera diferente.
Klaatu von Schlacker
1
Básicamente quiero saber los entresijos de esto. Desearía que Ken Thompson fuera mi padre :)
Larry Lawless
Llegarás ahi. Créeme, después de usar estas cosas diariamente durante un tiempo, todo comienza a hundirse, y mientras sigas preguntando "¿por qué?" y leyendo documentos para las respuestas, ¡eventualmente aprendes mucho!
Klaatu von Schlacker
En Linux Mint 18 Cinnamon, asegúrese de verificar /etc/profile.d/jdk_home.sh Cambié el nombre de este archivo a jdk_home.sh.old y ahora mi ruta no se sobrescribe y puedo llamar a java -version y ver Java 9 como esperado. Aunque seleccioné correctamente Java 9 en update-aternatives --config java este archivo jdk_home.sh siguió anulando el $ PATH
flyingdrifter
3

Para agregar a las otras respuestas:

bashse establecerá PATHen un valor predeterminado codificado si no está configurado en el entorno. En una máquina Ubuntu Server 16.04.2, obtengo:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Podemos verificar que este valor esté codificado y no se lea desde el entorno o algún archivo, utilizando la stringsutilidad:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Sin embargo, obtengo un resultado diferente en mi máquina Arch Linux:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Por lo tanto, parece que este valor predeterminado se elige en el momento en que bashse creó el binario, que depende del sistema operativo / distribución en uso.

Vladimir Panteleev
fuente