Establecer la variable PATH en / etc / environment vs .profile

58

¿Dónde está el lugar preferido para configurar el PATHenvvar?

~/.profileo /etc/environment?

¿Cuál es el caso cuando PATHse establece en ambos lugares? ¿Es el resultado final una concatenación de ambos valores establecidos en esos dos lugares?

pkaramol
fuente
La última asignación a PATH prevalece, por supuesto. La mayoría de los scripts lo establecen explícitamente al comienzo del script.
AlexP

Respuestas:

72

Resumen:

  • Si desea agregar una ruta (por ejemplo /your/additional/path) a su PATHvariable solo para su usuario actual y no para todos los usuarios de su computadora, normalmente la coloca al final de Me ~/.profilegusta en uno de esos dos ejemplos:

    PATH="/your/additional/path:$PATH"
    PATH="$PATH:/your/additional/path"
    

    Tenga en cuenta que las prioridades de la ruta descienden de izquierda a derecha, por lo que la primera ruta tiene la máxima prioridad. Si agrega su ruta a la izquierda de $PATH, tendrá la máxima prioridad y los ejecutables en esa ubicación anularán a todos los demás. Si agrega su ruta a la derecha, tendrá la prioridad más baja y se preferirán los ejecutables de las otras ubicaciones.

  • Sin embargo, si necesita establecer esa variable de entorno para todos los usuarios, todavía no recomendaría tocar /etc/environmentpero crear un archivo con el nombre que termine .shen /etc/profile.d/. El /etc/profilescript y todos los scripts en /etc/profile.dson el equivalente global del personal de cada usuario ~/.profiley se ejecutan como scripts de shell normales por todos los shells durante su inicialización.


Mas detalle:

  • /etc/environmentes un archivo de configuración de todo el sistema, lo que significa que es utilizado por todos los usuarios. Sin rootembargo, es propiedad de él , por lo que debe ser un usuario administrador y usarlo sudopara modificarlo.

  • ~/.profilees uno de los scripts de inicialización de shell personal de su propio usuario. Cada usuario tiene uno y puede editar su archivo sin afectar a otros.

  • /etc/profiley /etc/profile.d/*.shson los scripts de inicialización global que son equivalentes ~/.profilepara cada usuario. Sin embargo, los scripts globales se ejecutan antes que los scripts específicos del usuario; y el principal /etc/profileejecuta todos los *.shscripts /etc/profile.d/justo antes de salir.


  • El /etc/environmentarchivo normalmente contiene solo esta línea:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    

    Establece la PATHvariable para todos los usuarios del sistema en este valor predeterminado, que no debe modificarse de manera importante. Por lo menos no debe quitar cualquiera de las rutas importantes como /bin, /sbin, /usr/biny /usr/sbindesde ella.

    Este archivo se lee como uno de los primeros archivos de configuración por cada shell de cada usuario. Tenga en cuenta que no es un script de shell . ¡Es solo un archivo de configuración que se analiza de alguna manera y que solo puede contener asignaciones de variables de entorno!

  • El ~/.profilearchivo puede contener muchas cosas, por defecto contiene, entre otras cosas, una comprobación de si ~/binexiste un directorio y lo agrega a la PATHvariable existente del usuario , como esta (en versiones anteriores de Ubuntu anteriores a 16.04, que lo agrega incondicionalmente) y en 18.04 , que también agrega "~ / .local / bin"):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    

    Verá que el valor anterior de PATHse reutiliza aquí y la nueva ruta solo se agrega al principio en lugar de sobrescribir todo. Cuando desee agregar nuevas rutas manualmente, también debe mantener siempre el $PATHvalor anterior en algún lugar de la nueva cadena.

    Este script de inicialización es leído solo por los shells del usuario al que pertenece, pero hay otra condición:

    # ~/.profile: executed by the command interpreter for login shells.
    # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
    # exists.
    

    Por lo tanto, si usa el shell Bash predeterminado, debe asegurarse de que no tiene un ~/.bash_profileo ~/.bash_loginsi desea que los cambios ~/.profiletengan un efecto para su usuario.


Para una comprensión completa de las variables de entorno, consulte: https://help.ubuntu.com/community/EnvironmentVariables


Pregunta relacionada: diferencia entre bash.bashrc y / etc / environment file

Byte Commander
fuente
2
Hoy en día ~/.profileno se comprueba la existencia de ~/bin, pero simplemente tiene la línea:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
Gunnar Hjalmarsson
1
@GunnarHjalmarsson Definir "hoy en día", por favor? Estoy ejecutando 16.04 y así es como se ve allí.
Byte Commander
2
/etc/skel/.profileen 16.04 tiene la línea que mencioné. Aparentemente creaste tu usuario en una versión anterior.
Gunnar Hjalmarsson
1
@GunnarHjalmarsson Gracias por la información, hasta hace unos cinco minutos , pensé que el valor predeterminado ~/.profiletodavía tenía esto también, pero tienes razón, /etc/skel/.profileno lo tiene en mi sistema actualizado 16.04 (y una cuenta de usuario creada al instalar 16.04 en otra máquina no lo tiene en su .profile).
Eliah Kagan
2
"... ejecutados como scripts de shell normales por todos los shells durante su inicialización". Creo que esto es engañoso. Podría sugerir (para algunos) que simplemente abriendo un shell de terminal sin inicio de sesión desde el escritorio de la GUI ejecutará / etc / profile, lo que no hará. askubuntu.com/questions/155865/…
Hawkeye Parker
22

Esta respuesta es principalmente sobre el orden en que PATHse asignan las variables de entorno como cuando se especifica en diferentes archivos de configuración. También cubro dónde debería configurarlos, pero la lista a continuación no enumera los archivos en el orden en que debería considerar usarlos. Para obtener información general sobre la configuración PATHy otras variables de entorno en Ubuntu, también recomiendo leer EnvironmentVariables y las otras respuestas a esta pregunta.

El lugar preferido para configurar PATHdepende de los usuarios para los que necesita configurarlo y cuándo y cómo desea que se configure. Parte de su decisión será si desea establecer una variable de entorno para todos los usuarios o por usuario. Si no está seguro, le recomiendo configurarlo para un solo usuario (por ejemplo, su cuenta) en lugar de en todo el sistema.

Como dice AlexP , la PATHvariable de entorno tendrá el valor que se le asignó más recientemente . En la práctica, la mayor parte del tiempo establecido PATH, que incluyen la edad, el valor de PATHen el nuevo valor, de modo que las entradas anteriores se mantienen.

Por lo tanto, en la práctica, cuando PATHse configura a partir de múltiples archivos, generalmente contiene las entradas dadas en todos los archivos. Pero eso solo sucede porque todos los archivos que lo configuran, excepto el primero, generalmente hacen referencia a la PATHvariable en sí, lo que hace que su valor anterior se incluya en el nuevo.

Por lo tanto, en efecto está solicitando el orden en el que PATHtienen efecto las configuraciones en varios archivos.

Los lugares comunes de uso general para configurar PATHse enumeran a continuación en el orden en que surten efecto cuando un usuario inicia sesión, no en el orden en que normalmente debería considerar usarlos . Cada uno de los lugares enumerados a continuación es una opción razonable para establecer PATH en algunas situaciones , pero solo unos pocos son buenas opciones la mayor parte del tiempo.

En la lista a continuación, verá algunos nombres de directorio como ~/.profile. En caso de que no esté familiarizado con la expansión tilde , ~/consulte el directorio de inicio del usuario actual. Principalmente uso esta sintaxis para la compacidad. Se admite en scripts de shell, pero no en archivos de configuración de PAM.

1. Para todos los usuarios: /etc/environment

PAM en Ubuntu hace que las variables de entorno enumeradas /etc/environmentse establezcan, si ese archivo existe, lo que por defecto existe. Así es como las variables de entorno para todos los usuarios se configuran más comúnmente.

$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Si debe establecer variables de entorno para todas las cuentas de usuario, en lugar de solo su cuenta de usuario, entonces modificar ese archivo es probablemente su mejor opción. Recomiendo hacer una copia de seguridad primero. Una forma de hacer una copia de seguridad de este archivo es ejecutar:

sudo cp /etc/environment /etc/environment.orig

La .origextensión no se requiere específicamente: puede sentirse bien al nombrar el archivo de copia de seguridad de cualquier cosa que no sea confusa o que ya se esté utilizando. (Además .orig, .old, .backupy .bakson comunes.)

Puede editar este archivo en cualquiera de las formas en que podría editar cualquier otro archivo que el usuario root ( sudoedit /etc/enviromnment, sudo nano -w /etc/environment, gksudo gedit /etc/environment, etc.)

/etc/environmentno admite incluir el valor anterior de una variable automáticamente. Pero esto generalmente no es necesario, ya que la mayoría de las veces establecería una variable de entorno para todos los usuarios mediante la edición /etc/environment, de todos modos desearía que ese sea su valor inicial cuando el usuario inicie sesión. El usuario podría cambiarlo a su gusto. Por lo general, es bueno que los usuarios puedan hacer esto.

2. Para todos los usuarios: /etc/security/pam_env.conf

PAM lee las variables de entorno para todos los usuarios /etc/security/pam_env.conf, especificadas con la misma sintaxis que la utilizada en los ~/.pam_environmentarchivos por usuario (ver más abajo).

Cuando se establece la misma variable de entorno en ambos /etc/environmenty /etc/security/pam_env.conf, pam_env.confse utiliza el valor en , incluso si ese valor se especifica como en DEFAULTlugar de OVERRIDE.

Sin embargo, cuando reemplaza una línea environmentcon una entrada pam_env.conf, puede incluir el contenido del valor reemplazado. Consulte la siguiente sección .pam_environmentpara obtener más detalles (ya que usa la misma sintaxis).

Por lo general, no es necesario editar pam_env.confy debe tener mucho cuidado si lo hace , ya que una línea con formato incorrecto generalmente evitará que todas las cuentas de usuario normales inicien sesión. Por ejemplo, el valor predeterminado pam_env.confcontiene las líneas:

#PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

Esto se presenta como uno de varios ejemplos. Una de las cosas que ilustra es cómo dividir una tarea en varias líneas con \. Suponga que descomenta solo la primera línea, pero olvidó descomentar la segunda línea:

PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

¡No hagas esto!

Solo lo probé por accidente y evitó que los usuarios inicien sesión con éxito. Para solucionarlo, tuve que arrancar en modo de recuperación y volver a cambiarlo. (Afortunadamente hice esto en una máquina virtual que uso solo para probar cosas, por lo que no me causó ningún problema).

3. Para un usuario: .pam_environmenten el directorio de inicio del usuario

Una de las formas de establecer una variable de entorno para un solo usuario es que ese usuario edite (o cree) .pam_environmenten su directorio de inicio. Los valores establecidos en este archivo reemplazan a los establecidos en el /etc/environmentarchivo global .

.pam_environmentno es parte del esqueleto de archivos que se copia en la carpeta de inicio de un usuario cuando se crea inicialmente la cuenta de usuario. Sin embargo, si crea ese archivo en su directorio de inicio, puede usarlo para establecer variables de entorno como PATH. A diferencia /etc/environment(pero similar /etc/security/pam_env.conf), los .pam_environmentarchivos por usuario admiten expandir el valor anterior de una variable de entorno a uno nuevo. Sin embargo, no son scripts de shell, y debe usar una sintaxis especial para lograr esto, que difiere un poco de la sintaxis que usaría en un archivo como .profile.

Por ejemplo, si tenía un bin2directorio en su directorio personal que desea agregar al final PATH, puede hacerlo agregando esta línea a .pam_environment:

PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2

Consulte la ~/.pam_environmentsubsección de Variables de entorno (de la cual el ejemplo anterior está muy adaptado) man pam_env, y man pam_env.confpara más detalles.

Aunque esta vez se promocionó como la forma preferida para que los usuarios de Ubuntu cambien o agreguen variables de entorno y todavía se considera una opción razonable y aceptable, debe tener cuidado al editar.pam_environment . Al igual que las ediciones en todo el sistema /etc/security/pam_env.conf(ver arriba), una línea con formato incorrecto en el .pam_environmentarchivo de un usuario evitará que los inicios de sesión tengan éxito. (He probado esto a propósito esta vez). Para obtener información sobre cómo han evolucionado las recomendaciones , vea los comentarios de Gunnar Hjalmarsson a continuación y esta discusión . ubuntu-devel

Tal error es mucho menos grave, en general , que una línea mal formada pam_env.conf, porque afecta a un solo usuario. Sin embargo, en el caso de un sistema Ubuntu de escritorio con una sola cuenta de usuario que permita inicios de sesión, tal error durante la edición .pam_environmentserá tan malo como un error de edición pam_env.conf: si aún no ha iniciado sesión, no podrá para solucionarlo sin arrancar en modo de recuperación (o desde un USB en vivo, etc.).

(Si tiene otras cuentas de usuario, puede iniciar sesión como otro usuario y solucionar el problema. Incluso si no son administradores y no pueden sudorootear, aún pueden ejecutarse y se les pedirá que ingresen su (no su) contraseña . el huésped cuenta, sin embargo, no puede hacer esto, ya que está prohibido el uso de asumir la identidad de otro usuario).su your-accountsu

4. Para todos los usuarios: /etc/profiley archivos dentro/etc/profile.d/

Los shells compatibles con Bourne (incluido bashel shell de usuario predeterminado en Ubuntu) ejecutan los comandos /etc/profilecuando se invocan como un shell de inicio de sesión.

Ubuntu /etc/profile.dtermina con:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Esto hace que los comandos en cualquier archivo en el /etc/profile.d/directorio cuyo nombre termine también .shse ejecuten.

La mayoría de los administradores de pantallas hacen que los comandos en /etc/profile(y, por lo tanto, los archivos en /etc/profile.d) se ejecuten también para inicios de sesión gráficos. Sin embargo, no todos lo hacen, y ese es un argumento importante a favor del uso de las facilidades proporcionadas por PAM en su lugar (ver arriba), a menos que nunca haya inicios de sesión gráficos en este sistema, que podría ser el caso, por ejemplo, si es Un servidor sin GUI instalado.

Es tradicional establecer variables de entorno de todo el sistema /etc/profile, pero a menudo ya no es la mejor opción. Si no puede configurar una variable de entorno /etc/environmenty debe configurarla para todos los usuarios, entonces probablemente sea mejor crear un nuevo archivo /etc/profile.d/que editarlo /etc/profile. Una razón para esto es que, cuando se actualiza Ubuntu, puede haber un nuevo /etc/profilearchivo predeterminado . Dependiendo de cómo realice la actualización, se conservará el archivo antiguo (con sus cambios), antes de ese archivo de configuración actualizado en particular, o se le pedirá que maneje la situación.

Cuando se establece la misma variable de entorno en ambos /etc/profiley uno o más archivos /etc/profile.d, ¿cuál se realiza en último lugar? Esto depende de si los comandos en /etc/profileese conjunto aparecen antes o después de que profile.dse hayan obtenido los archivos (por el código que he citado anteriormente). Los comandos en /etc/profilese ejecutan en el orden en que aparecen.

/etc/profilees un script de shell, y su sintaxis no es la misma que la de los archivos de configuración de PAM discutidos anteriormente . Su sintaxis es la misma que la sintaxis para el ~/.profilearchivo por usuario (ver más abajo).

Si necesita escribir código que decida si agregar o no un directorio en particular PATH(y hacerlo para todos los usuarios), no podrá usarlo /etc/environmentni /etc/security/pam_env.confhacerlo. Esta es quizás la situación principal donde es mejor usar /etc/profileo en su /etc/profile.d/lugar.

5. Para un usuario: .bash_profileen el directorio de inicio del usuario

Si un usuario lo ha hecho ~/.bash_profile, bash lo usa en lugar de ~/.profileo ~/.bash_login(ver más abajo). Por lo general, no debería tener un .bash_profileen su directorio de inicio.

Si lo hace, generalmente debería contener un comando de origen ~/.profile(por ejemplo, . "$HOME/.profile"). De lo contrario, el contenido del .profilearchivo por usuario no se ejecuta en absoluto.

6. Para un usuario: .bash_loginen el directorio de inicio del usuario

Si un usuario lo ha hecho ~/.bash_login, bash lo usa en lugar de ~/.profile(ver más abajo), a menos que ~/.bash_profileexista, en cuyo caso ninguno de los otros se usará a menos que provenga de `~ / .bash_login.

Al igual que con .bash_profile, generalmente no debe tener un .bash_loginarchivo en su directorio de inicio.

7. Para un usuario: .profileen el directorio de inicio del usuario.

Cuando un shell de estilo Bourne se ejecuta como un shell de inicio de sesión, ejecuta los comandos en /etc/profile(que generalmente incluye comandos que hacen /etc/profile.d/que se ejecuten los comandos en los archivos , ver arriba). Después de eso, ejecuta los comandos .profileen el directorio de inicio del usuario. Este archivo es independiente para cada usuario. (Bash realmente se ejecuta .bash_profileo, en .bash_logincambio, si existen, pero, para los usuarios de un sistema Ubuntu, esos archivos rara vez deberían existir o no existen. Para obtener más información, consulte más arriba y 6.2 Archivos de inicio de Bash en el manual de Bash ).

~/.profilees, por lo tanto, el lugar principal para que el usuario ponga comandos que se ejecutan cuando inician sesión. Es el lugar tradicional para configurar PATH, pero dado que Ubuntu tiene el módulo pam_env y es compatible ~/.pam_environment, debería considerar usarlo.

Al igual que con /etc/profile, no todos los administradores de pantallas ejecutan este archivo para inicios de sesión gráficos, aunque la mayoría lo hace. Esta es una razón para preferir ~/.pam_environmentpara establecer las variables de entorno (tanto como uno puede preferir /etc/environmenta /etc/profile).

Puede ampliar las variables de entorno, incluyendo PATHsí mismo, cuando se establece PATHen .pam_environment(ver más arriba). Sin embargo, si necesita configurar PATHde una manera más sofisticada, es posible que deba usar su .profile. En particular, si desea verificar si existe un directorio cada vez que un usuario inicia sesión y solo lo agrega PATHsi es así, entonces no podrá usar su .pam_environmentarchivo para agregar ese directorio a su PATH.

Por ejemplo, el .profilearchivo predeterminado por usuario en Ubuntu solía terminar con:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Vea el comentario de Gunnar Hjalmarsson sobre la respuesta de Byte Commander para más detalles.

Esto verifica si tiene un binsubdirectorio de su directorio personal. Si es así, agrega ese subdirectorio al comienzo de su PATH.

Esa lista omite algunas posibilidades.

Hay otras formas en que las variables de entorno se configuran cuando los usuarios inician sesión que dependen más del tipo de inicio de sesión. Por ejemplo, ocasionalmente puede tener variables de entorno que se configuran solo para inicios de sesión gráficos o solo para inicios de sesión remotos basados ​​en SSH. La lista anterior no cubre tales casos.

He omitido algunos archivos en los que las personas a veces definen variables de entorno, como ~/.bashrcy /etc/bash.bashrc, porque generalmente no son lugares recomendados para configurar PATHy es raro que realmente los use para este propósito. Si usa estos archivos para agregar directorios PATH, a veces se agregarán muchas veces y es muy confuso cuando lo examina $PATH. (En casos extremos, esto puede ralentizar las cosas, pero generalmente es solo cuestión de mantener todo limpio y comprensible).

Dado que bashes el shell de inicio de sesión predeterminado de Ubuntu para los usuarios, y la mayoría de los usuarios lo usan o algún otro shell compatible con POSIX, he omitido información sobre cómo se configuran las variables de entorno en otros shells de estilo no Bourne como tcsh.

Eliah Kagan
fuente
1
[comentario # 1 de 2] ¡Gracias por esta extensa descripción! (Hice una edición menor). Sin embargo, tengo dudas sobre las formas recomendadas. Hace unos años, EnvironmentVariables mencionó /etc/environment/ ~/.pam_environmentcomo los archivos recomendados. Después de consultar con los desarrolladores, lo cambié para que fuera neutral entre PAM y /etc/profile.d/*.sh/ ~/.profile, y todavía tiendo a verlo de esa manera.
Gunnar Hjalmarsson
1
[comentario # 2 de 2] Usted mencionó un par de argumentos a favor de PAM. Argumentos importantes a favor de /etc/profile.d/*.sh/ ~/.profileson que la sintaxis es más simple y que lightdm / gdm son indulgentes en caso de errores (ni siquiera los errores de sintaxis le impiden iniciar sesión, sino que solo generan mensajes de advertencia).
Gunnar Hjalmarsson
Cuando dices pam_env.so, ¿querías decir pam_env.conf?
Johan Boulé
@ JohanBoulé Sí, quise decir pam_env.conf. ¡Gracias! He editado para arreglarlo.
Eliah Kagan
3

El archivo / etc / environment no es un archivo de script que no se puede usar para exportar allí y no admite la expansión variable del tipo $ HOME, solo pares de variables = valores simples. Por lo tanto, para usar ese archivo, simplemente necesitará agregar su ruta a la definición existente, específicamente para configuraciones de variables de entorno de todo el sistema. uno por línea. Específicamente, este archivo almacena la configuración regional y la configuración de ruta de todo el sistema.

~ / .profile : este archivo se ejecuta cada vez que se ejecuta un shell bash, generalmente es el recomendado para las variables de entorno, sin embargo, tiene la desventaja de que solo se invoca mediante shells de inicio de sesión, por lo que para que surta efecto tendrá que para cerrar sesión y volver a iniciarla, o al menos, iniciar un nuevo shell de inicio de sesión.

eGhoul
fuente
1

El lugar preferido para establecer variables ambientales depende de varias cosas:

  1. ¿Eres el único que usa la computadora?
    • En este caso, el mejor lugar para configurarlo sería en el /etc/environmentpuesto que no hay peligro de acceso no autorizado.
  2. Si el sistema es usado por muchos
    • Si todos pudieran acceder a las variables , entonces la ubicación sería /etc/environment, pero
    • si los usuarios individuales deberían haber seleccionado el acceso a ellos, cada uno debería establecer el suyo en~/.profile relación con cada usuario del sistema, ya que está ubicado en el directorio de inicio de cada usuario.

El sistema leerá /etc/environmentantes de leer ~/.profile. No ocurre concatenación y, como dijo Alex P , prevalece la última asignación al camino.

Para obtener una visión más detallada de los factores que determinan cómo ~/.profiley cómo /etc/environmentjugar con otras ubicaciones similares, vaya aquí y aquí , ya que estos factores influirán en la forma en que utilice estas ubicaciones.

George Udosen
fuente