Configuración de la variable PATH en / etc / environment vs .profile

29

¿Dónde está el lugar preferido para establecer el PATH envvar?

~/.profile o /etc/environment ?

¿Cuál es el caso cuando PATH está establecido en ambos lugares? ¿El resultado final es una concatenación de ambos valores establecidos en esos dos lugares?

    
pregunta pkaramol 30.12.2016 - 13:45

4 respuestas

37

Resumen:

  • Si desea agregar una ruta (por ejemplo, /your/additional/path ) a su variable PATH solo para su usuario actual y no para todos los usuarios de su computadora, normalmente la pone al final de ~/.profile como en una 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 prioridad más alta. Si agrega su ruta a la izquierda de $PATH , tendrá la prioridad más alta y los ejecutables en esa ubicación anularán 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, aún no recomendaría tocar /etc/environment sino crear un archivo cuyo nombre de archivo termine en .sh en /etc/profile.d/ . El script /etc/profile y todos los scripts en /etc/profile.d son los equivalentes globales del ~/.profile personal de cada usuario y se ejecutan como scripts normales de shell durante todas las shells durante su inicialización.

Más detalles:

  • /etc/environment es un archivo de configuración de todo el sistema, lo que significa que es utilizado por todos los usuarios. Sin embargo, es propiedad de root , por lo que debe ser un usuario administrador y usar sudo para modificarlo.

  • ~/.profile es uno de los scripts de inicialización de shell personales de su propio usuario. Cada usuario tiene uno y puede editar su archivo sin afectar a los demás.

  • /etc/profile y /etc/profile.d/*.sh son los scripts de inicialización global que son equivalentes a ~/.profile para cada usuario. Sin embargo, los scripts globales se ejecutan antes que los scripts específicos del usuario; y el% /etc/profile ejecuta todos los scripts *.sh en /etc/profile.d/ justo antes de que salga.

  • El archivo /etc/environment 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 variable PATH para todos los usuarios en el sistema a este valor predeterminado, que no debe modificarse de manera importante. Al menos no deberías eliminar ninguna de las rutas importantes como /bin , /sbin , /usr/bin y /usr/sbin de 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 archivo ~/.profile puede contener muchas cosas, por defecto contiene entre otras cosas un control de si existe un directorio ~/bin y lo agrega a la variable PATH existente del usuario, como esta (en versiones anteriores de Ubuntu anteriores a 16.04 - lanzamientos más nuevos lo agregan incondicionalmente):

    # 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 PATH se vuelve a utilizar aquí y la nueva ruta se agrega al principio en lugar de sobrescribir todo. Cuando manualmente quiera agregar nuevas rutas, también debería mantener siempre el viejo valor de $PATH en alguna parte de la nueva cadena.

    Este script de inicialización solo es leído 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.
    

    Entonces, si usa el shell Bash predeterminado, debe asegurarse de no tener un ~/.bash_profile o ~/.bash_login si desea que los cambios en ~/.profile tengan un efecto para su usuario.

Para una comprensión completa de las variables de entorno, consulte: enlace

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

    
respondido por el Byte Commander 30.12.2016 - 14:10
16
  

Esta respuesta se trata principalmente de el orden en el que las variables de entorno, como PATH , se asignan cuando se especifican en diferentes archivos de configuración. También cubro donde generalmente debería establecerlos, 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 cómo configurar PATH y otras variables de entorno en Ubuntu, también recomiendo leer EnvironmentVariables y la otra responde a esta pregunta.

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

Como AlexP dice , el PATH la variable de entorno tendrá el valor que asignó recientemente . En la práctica, la mayoría del tiempo que configura PATH , incluye el valor antiguo de PATH en el nuevo valor, de modo que las entradas anteriores se conservan.

Por lo tanto, en la práctica, cuando PATH se establece a partir de varios archivos, por lo general contiene las entradas dadas en todos los archivos. Pero eso solo ocurre porque todos los archivos que lo configuran, excepto el primero, normalmente hacen referencia a la variable PATH , lo que hace que su valor anterior se incluya como el nuevo.

Por lo tanto, en realidad está solicitando el orden en que las configuraciones de PATH en varios archivos entran en vigencia.

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

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

1. Para todos los usuarios: /etc/environment

PAM en Ubuntu causa que las variables de entorno enumeradas en /etc/environment se establezcan, si ese archivo existe, que de forma predeterminada lo hace. Así es como se configuran las variables de entorno para todos los usuarios.

$ 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 la mejor opción es modificar ese archivo. 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 extensión .orig no se requiere específicamente: puede sentirse bien al nombrar el archivo de copia de seguridad para todo lo que no sea confuso o que ya esté en uso. (Además de .orig , .old , .backup y .bak son comunes.)

Puede editar este archivo de cualquier forma en que pueda editar cualquier otro archivo como usuario raíz ( sudoedit /etc/enviromnment , sudo nano -w /etc/environment , gksudo gedit /etc/environment , etc.)

/etc/environment no 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 editando /etc/environment , de todos modos querría que fuera 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 de /etc/security/pam_env.conf , especificadas con la misma sintaxis que se utiliza en los archivos ~/.pam_environment por usuario (ver a continuación).

Cuando la misma variable de entorno se establece en /etc/environment y /etc/security/pam_env.conf , se usa el valor en pam_env.conf , incluso si ese valor se especifica como DEFAULT en lugar de OVERRIDE .

Sin embargo, cuando reemplaza una línea en environment con una en pam_env.conf , puede incluir el contenido del valor reemplazado. Consulte la sección a continuación sobre .pam_environment para más detalles (ya que usa la misma sintaxis).

No suele ser necesario editar pam_env.conf y debes tener mucho cuidado si lo haces , ya que una línea malformada normalmente evitará que todas las cuentas de usuario normales inicien sesión. ¡en absoluto! Por ejemplo, el pam_env.conf predeterminado contiene 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 múltiples líneas con \ .Supongamos que descomponga 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!

Acabo de probarlo yo mismo por accidente e impidió que los usuarios inicien sesión con éxito. Para solucionarlo, tuve que arrancar en modo de recuperación y volver a cambiarlo. (Afortunadamente lo hice en una máquina virtual que uso solo para probar cosas, así que no me causó ningún problema).

3. Para un usuario: .pam_environment en 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_environment en su directorio de inicio. Los valores establecidos en este archivo sustituyen a los establecidos en el archivo global /etc/environment .

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

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

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

Consulte la subsección ~/.pam_environment de EnvironmentVariables (desde el cual el ejemplo anterior está estrechamente adaptado), man pam_env , y man pam_env.conf para más detalles.

Aunque alguna vez se promocionó como la forma preferida para que los usuarios de Ubuntu cambien o añadan 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 de /etc/security/pam_env.so en todo el sistema (consulte más arriba), una línea mal formada en el archivo .pam_environment 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 las recomendaciones tienen evolucionado , consulte comentarios de Gunnar Hjalmarsson a> below y este ubuntu-devel discussion .

Este error es mucho menos grave, en general , que una línea mal formada en pam_env.so , porque afecta solo a un usuario. Sin embargo, en el caso de un sistema Ubuntu de escritorio con solo una cuenta de usuario que permite inicios de sesión, tal error al editar .pam_environment será tan malo como un error al editar pam_env.so - si aún no ha iniciado sesión, no podrá arreglarlo sin reiniciar en modo de recuperación (o desde un USB en vivo, etc.).

(Si tiene otras cuentas de usuario, entonces puede iniciar sesión como otro usuario y solucionar el problema. Incluso si no son un administrador y no pueden sudo a la raíz, aún pueden ejecutar su your-account y ser se le solicita ingresar su contraseña (no la suya). Sin embargo, la cuenta guest no puede hacer esto, ya que está prohibido usar su para asumir la identidad de otro usuario).

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

Conchas compatibles con Bourne (incluido bash , el shell de usuario predeterminado en Ubuntu) ejecuta los comandos en /etc/profile cuando se invoca como un shell de inicio de sesión.

Ubuntu /etc/profile.d termina 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 directorio /etc/profile.d/ cuyo nombre termine en .sh también se ejecuten.

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

Es tradicional establecer variables de entorno de todo el sistema en /etc/profile , pero a menudo esta no es la mejor opción. Si no puede establecer una variable de entorno en /etc/environment , y debe configurarla para todos los usuarios, entonces es mejor hacer un nuevo archivo en /etc/profile.d/ que editar /etc/profile .Una razón para esto es que, cuando se actualiza Ubuntu, puede haber un nuevo archivo /etc/profile predeterminado. Dependiendo de cómo realice la actualización, se conservará el archivo anterior (con sus cambios), dejando de lado ese archivo de configuración actualizado en particular, o se le pedirá que maneje la situación.

¿Cuando la misma variable de entorno está configurada en /etc/profile y uno o más archivos en /etc/profile.d , que se realiza al final? Esto depende de si los comandos en /etc/profile que los configuraron aparecen antes o después de que los archivos en profile.d hayan sido originados (por el código que he citado anteriormente). Los comandos en /etc/profile se ejecutan en el orden en que aparecen.

/etc/profile es un script de shell, y su sintaxis es no la misma que la de los archivos de configuración de PAM mencionados anteriormente . Su sintaxis es la misma que la sintaxis del archivo ~/.profile por usuario (ver a continuación).

Si necesita escribir un código que decida si agrega o no un directorio particular a PATH (y para hacerlo para todos los usuarios), no podrá usar /etc/environment o /etc/security/pam_env.conf para hacer eso. Esta es quizás la situación principal en la que es mejor usar /etc/profile o /etc/profile.d/ en su lugar.

5. Para un usuario: .bash_profile en el directorio de inicio del usuario

Si un usuario tiene ~/.bash_profile , bash lo usa en lugar de ~/.profile o ~/.bash_login (ver a continuación). Por lo general, no debería tener un .bash_profile en su directorio de inicio.

Si lo hace, generalmente debe contener un comando para el origen ~/.profile (por ejemplo, . "$HOME/.profile" ). De lo contrario, el contenido del archivo .profile por usuario no se ejecuta en absoluto.

6. Para un usuario: .bash_login en el directorio de inicio del usuario

Si un usuario tiene ~/.bash_login , bash lo usa en lugar de ~/.profile (ver abajo), a menos que ~/.bash_profile exista, en cuyo caso ninguno de los otros se usará a menos que provenga de '~ / .bash_login.

Al igual que con .bash_profile , generalmente no debería tener un archivo .bash_login en su directorio de inicio.

7. Para un usuario: .profile en el directorio de inicio del usuario.

Cuando un shell Bourne-style se ejecuta como un shell de inicio de sesión, ejecuta los comandos en /etc/profile (que generalmente incluye comandos que hacen que los comandos en los archivos en /etc/profile.d/ se ejecuten - vea arriba). Después de eso, ejecuta los comandos en .profile en el directorio de inicio del usuario. Este archivo es independiente para cada usuario. (De hecho, Bash ejecuta .bash_profile o .bash_login si existen, pero, para los usuarios de un sistema Ubuntu, esos archivos raramente deberían existir o no existen. Para más detalles, consulte arriba y 6.2 Bash Startup Files en el manual de Bash ).

~/.profile es, por lo tanto, el lugar principal para que el usuario ponga los comandos que se ejecutan cuando inician sesión. Es el lugar tradicional para que configure su PATH , pero como Ubuntu tiene el módulo pam_env y admite ~/.pam_environment , debería considerar usarlo.

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

Puede expandir las variables de entorno, incluido PATH , cuando establece PATH en .pam_environment (consulte más arriba). Sin embargo, si necesita establecer PATH de una manera más sofisticada, es posible que deba usar su .profile en su lugar. En particular, si desea comprobar si existe un directorio cada vez que un usuario inicia sesión y solo lo agrega a PATH , si lo hace, no podrá usar su archivo .pam_environment para agregar ese directorio a su PATH .

Por ejemplo, el archivo por usuario .profile predeterminado en Ubuntu utilizado para finalizar con:

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

Ver Gunnar Hjalmarsson href="https://askubuntu.com/ preguntas / 866161 / setting-path-variable-in-etc-environment-vs-profile # comment1339354_866169 "> comment en Byte Respuesta del comandante para más detalles.

Esto comprueba si tienes un subdirectorio bin de tu directorio personal. Si es así, agrega ese subdirectorio al comienzo de su PATH .

Esa lista omite algunas posibilidades.

Hay otras maneras 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 configuradas solo para inicios de sesión gráficos o solo para inicios de sesión remotos basados ​​en SSH. La lista anterior no cubre estos casos.

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

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

    
respondido por el Eliah Kagan 30.12.2016 - 18:30
3
El archivo

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

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

    
respondido por el eGhoul 30.12.2016 - 14:07
1

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

  1. ¿Eres el único que usa la computadora?
    • En este caso, el mejor lugar para establecerlo sería en /etc/environment ya que no hay peligro de que el acceso no sea autorizado.
  2. Si el sistema es utilizado por muchos
    • Si todas las variables deben ser accedidas por todos, la ubicación sería /etc/environment , pero
    • si usuarios individuales debieran haber seleccionado el acceso a ellos, cada uno debería establecer los suyos en ~/.profile correspondientes a cada usuario del sistema ya que está ubicado en cada hogar de usuarios directorio.

El sistema leerá /etc/environment antes de leer ~/.profile . No hay concatenación y, al igual que Alex P , dice que la última asignación prevalece en la ruta.

Para una vista más detallada de los factores que determinan cómo ~/.profile y /etc/environment juegan con otras ubicaciones similares, vaya aquí y aquí , ya que estos factores influirán en la forma en que utiliza estas ubicaciones.

    
respondido por el George Udosen 30.12.2016 - 14:10

Lea otras preguntas en las etiquetas