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

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

¿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?

Respuesta1

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 ~/.profilecomo 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 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 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 otras ubicaciones.

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


Mas detalle:

  • /etc/environmentEs un archivo de configuración de todo el sistema, lo que significa que lo utilizan todos los usuarios. Sin embargo, es propiedad de root, por lo que debes 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 los demás.

  • /etc/profiley /etc/profile.d/*.shson los scripts de inicialización globales que equivalen a ~/.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 sólo 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 cambiarse de manera importante. Al menos no deberías eliminar ninguna de las rutas importantes como , /biny de él./sbin/usr/bin/usr/sbin

    Este archivo es leído como uno de los primeros archivos de configuración por cada shell de cada usuario. Tenga en cuenta que esno 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, de forma predeterminada contiene, entre otras cosas, una verificación de si ~/binexiste un directorio y lo agrega a la PATHvariable existente del usuario, como este (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 únicamente por los shells del usuario al que pertenece, pero existe 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_profileo ~/.bash_loginsi desea que los cambios ~/.profiletengan 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 el archivo bash.bashrc y /etc/environment

Respuesta2

Esta respuesta se trata principalmente deel orden en el que PATHse asignan las variables de entorno comocuando se especifica en diferentes archivos de configuración. También cubro dónde deberías configurarlos normalmente, pero la siguiente lista no enumera los archivos en el orden en que deberías considerar usarlos. Para obtener información general sobre la configuración PATHy otras variables de entorno en Ubuntu, también recomiendo leerVariables de entornoy las otras respuestas a esta pregunta.

El lugar preferido para establecer PATHdepende dequé usuariosnecesitas configurarlo para ycuando y cómoquieres que esté configurado. 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 para todo el sistema.

ComoAlexP dice, la PATHvariable de entorno tendrá el valor que teníaasignado más recientemente. En la práctica,mayoríadel tiempo que establezcas PATH, incluyes elviejovalor de PATHen el nuevo valor, de modo que se conserven las entradas anteriores.

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

Por lo tanto, en realidad está solicitando el orden en que PATHentran en vigor las configuraciones en varios archivos.

Los lugares comunes y de uso general que se pueden configurar PATHse enumeran a continuación en el orden en que entran en vigor cuando un usuario inicia sesión.noen el orden en el que normalmente debería considerar usarlos. Cada uno de los lugares enumerados a continuación es una opción razonable para establecerPATH enalgunosituaciones, pero sólo unas pocas son buenas opciones la mayor parte del tiempo.

En la siguiente lista, verá algunos nombres de directorio como ~/.profile. En caso de que no estés familiarizado conexpansión de tilde, ~/se refiere al directorio de inicio del usuario actual. Utilizo principalmente esta sintaxis para que sea más compacto. Es compatible con scripts de shell, peronoen los archivos de configuración PAM.

1. Para todos los usuarios:/etc/environment

PAMen Ubuntu hace que se establezcan las variables de entorno enumeradas /etc/environment, si ese archivo existe, lo cual es así de forma predeterminada. Así es como se configuran más comúnmente 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 paratodocuentas de usuario, en lugar de solo su cuenta de usuario, entonces modificar ese archivo probablemente sea 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 es requerida específicamente; puede sentirse bien al nombrar el archivo de respaldo con cualquier nombre que no sea confuso o que ya no esté en uso. (Además .orig, .oldy .backupson .bakcomunes).

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

/etc/environmentno admite la inclusión automática del valor anterior de una variable. Pero esto generalmente es innecesario, ya que la mayoría de las veces establecería una variable de entorno para todos los usuarios editando /etc/environment; de todos modos, desearía que ese fuera su valor inicial cuando el usuario inicie sesión. Luego, el usuario podrá cambiarlo como desee. Normalmente 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 usa en ~/.pam_environmentlos archivos por usuario (ver más abajo).

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

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

Generalmente no es necesario editar pam_env.confydebes tener mucho cuidado si lo haces, desde unmalformado¡La línea generalmente impedirá 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

Este se presenta como uno de varios ejemplos. Una de las cosas que ilustra es cómo dividir una tarea en varias líneas con \. Supongamos que descomentas solo la primera línea, pero olvidas 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!

Lo probé yo mismo por accidente e impidió que los usuarios iniciaran sesión correctamente. Para solucionarlo, tuve que iniciar 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 configurar una variable de entorno para un solo usuario es que ese usuario la 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 configurar variables de entorno como PATH. A diferencia de /etc/environment(pero como /etc/security/pam_env.conf), los archivos por usuario .pam_environmentadmiten la expansión del valor anterior de una variable de entorno a uno nuevo. Sin embargo, no son scripts de shell y debes usar una sintaxis especial para lograrlo, que difiere algo de la sintaxis que usarías en un archivo como .profile.

Por ejemplo, si tuviera un bin2directorio en su directorio de inicio que quisiera agregar al final de PATH, podría hacerlo agregando esta línea a .pam_environment:

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

Verla ~/.pam_environmentsubseccióndeVariables de entorno(del cual el ejemplo anterior está estrechamente adaptado),man pam_env, yman pam_env.confpara mas detalles.

Aunque alguna vez se promocionó como la forma preferida para que los usuarios de Ubuntu cambiaran o agregaran variables de entorno y todavía se considera una opción razonable y aceptable,debes 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 .pam_environmentel archivo de un usuario impedirá que los inicios de sesión se realicen correctamente. (He probado esto, esta vez a propósito). Para obtener información sobre cómolas recomendacionestenerevolucionado, verGunnar Hjalmarsson'scomentarios abajoyesta ubuntu-develdiscusión.

Un error así es mucho menos grave,en general, que una línea mal formada en pam_env.conf, porque afecta solo a un usuario. Sin embargo, en el caso de un sistema Ubuntu de escritorio con una sola cuenta de usuario que permite iniciar sesión, un error de este tipo durante la edición .pam_environmentserá tan grave como un error de edición pam_env.conf: si aún no ha iniciado sesión, no podrá para solucionarlo sin iniciar 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 es administrador y no puede sudorootear, aún puede ejecutarse y se le pedirá que ingrese su contraseña (no la suya). . Elsu your-accountinvitadocuenta, sin embargo, no puede hacer esto, ya que está prohibido usarla supara asumir la identidad de otro usuario).

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

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

Ubuntu /etc/profiletermina 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 también se ejecuten los comandos de cualquier archivo del /etc/profile.d/directorio cuyo nombre termine en ..sh

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

Es tradicional establecer variables de entorno para todo el sistema en /etc/profile, pero a menudo ya no es la mejor opción. Si no puede configurar una variable de entorno en /etc/environmenty debe configurarla para todos los usuarios, entonces probablemente sea mejor crear un nuevo archivo en /etc/profile.d/lugar de 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), prescindiendo 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 en 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 (según el código que cité anteriormente). Los comandos /etc/profilese ejecutan en el orden en que aparecen.

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

Si necesita escribir código quedecideSi desea 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 en la que es mejor utilizar /etc/profileo /etc/profile.d/en su lugar.

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

Si un usuario tiene ~/.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, normalmente debería contener un comando de origen ~/.profile(por ejemplo, . "$HOME/.profile"). De lo contrario, el contenido del archivo por usuario .profileno se ejecuta en absoluto.

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

Si un usuario tiene ~/.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, normalmente no deberías tener un .bash_loginarchivo en tu directorio de inicio.

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

Cuando se ejecuta un shell estilo Bourne como shell de inicio de sesión, ejecuta los comandos (que generalmente incluyen comandos que hacen que se ejecuten /etc/profilelos comandos en los archivos ; consulte más arriba). /etc/profile.d/Después de eso, ejecuta los comandos en .profileel directorio de inicio del usuario. Este archivo está separado para cada usuario. (Bash realmente se ejecuta .bash_profileo, .bash_loginen su lugar, si existen, pero, para los usuarios de un sistema Ubuntu, esos archivos rara vez deberían existir o existen. Para obtener más detalles, consulte más arriba y6.2 Archivos de inicio de Bashenel manual de bash.)

~/.profilePor lo tanto, es el lugar principal para que el usuario coloque los comandos que se ejecutan cuando inician sesión. Es el lugar tradicional para configurar tu PATH, pero dado que Ubuntu tiene el módulo pam_env y lo admite ~/.pam_environment, deberías considerar usarlo.

Al igual que con /etc/profile, no todos los administradores de pantalla ejecutan este archivo para inicios de sesión gráficos, aunque la mayoría lo hace.Esta es una razón para preferir ~/.pam_environmentconfigurar variables de entorno.(por mucho que uno prefiera /etc/environment) /etc/profile.

Puede expandir las variables de entorno, incluido PATHél mismo, cuando lo configura PATH( .pam_environmentver arriba). Sin embargo, si necesita configurar PATHde una manera más sofisticada, es posible que deba utilizar su .profilelugar. En particular, si desea verificar si existe un directorio cada vez que un usuario inicia sesión y solo agregarlo PATHsi existe, entonces no podrá usar su .pam_environmentarchivo para agregar ese directorio a su archivo PATH.

Por ejemplo, el archivo predeterminado por usuario .profileen Ubuntusolía hacerloterminar con:

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

VerGunnar Hjalmarsson'scomentarioenLa respuesta de Byte Commanderpara detalles.

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

Esa lista omite algunas posibilidades.

Hay otras formas en que se configuran las variables de entorno cuando los usuarios inician sesión que dependen más del tipo de inicio de sesión. Por ejemplo, es posible que ocasionalmente tenga variables de entorno que se configuren 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 donde 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 debas usarlos para este propósito. Si utiliza estos archivos para agregar directorios PATH, a veces se agregarán muchas veces y resultará muy confuso al examinarlos $PATH. (En casos extremos, esto puede ralentizar el proceso, pero normalmente es sólo 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 que no son de estilo Bourne, como tcsh.

Respuesta3

/etc/entornofile no es un archivo de script que no puede usar para exportar allí y no admite la expansión de variables del tipo $HOME, solo pares simplevariable=valor. Entonces, para usar ese archivo, simplemente deberá agregar su ruta a la definición existente, que está diseñada específicamente para configuraciones de variables de entorno en todo el sistema. una por línea. Específicamente, este archivo almacena la configuración regional y de ruta de todo el sistema.

~/.perfil- 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 que para que entre en vigor deberá cerrar sesión y de nuevo, o al menos, inicie un nuevo shell de inicio de sesión.

Respuesta4

bash lee estos archivos, pero zsh no:

  1. todo el sistema

    /etc/profile- No es buena idea editarlo directamente.
    /etc/profile.d/*.sh- obtenido por/etc/profile

  2. toda la sesión

    ~/.profile

https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh

información relacionada