¿Dónde está el lugar preferido para configurar el PATH
envvar?
~/.profile
o /etc/environment
?
¿Cuál es el caso cuando PATH
se 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 suPATH
variable solo para su usuario actual y no para todos los usuarios de su computadora, normalmente la coloca al final de~/.profile
como 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/environment
sino crear un archivo con el nombre del archivo que termine.sh
en/etc/profile.d/
. El/etc/profile
script y todos los scripts que contiene/etc/profile.d
son el equivalente global del personal de cada usuario~/.profile
y todos los shells los ejecutan como scripts de shell normales durante su inicialización.
Mas detalle:
/etc/environment
Es un archivo de configuración de todo el sistema, lo que significa que lo utilizan todos los usuarios. Sin embargo, es propiedad deroot
, por lo que debes ser un usuario administrador y usarlosudo
para modificarlo.~/.profile
es 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/profile
y/etc/profile.d/*.sh
son los scripts de inicialización globales que equivalen a~/.profile
para cada usuario. Sin embargo, los scripts globales se ejecutan antes que los scripts específicos del usuario; y el principal/etc/profile
ejecuta todos los*.sh
scripts/etc/profile.d/
justo antes de salir.
El
/etc/environment
archivo 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
PATH
variable 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 ,/bin
y 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
~/.profile
archivo puede contener muchas cosas, de forma predeterminada contiene, entre otras cosas, una verificación de si~/bin
existe un directorio y lo agrega a laPATH
variable 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
PATH
se 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$PATH
valor 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_profile
o~/.bash_login
si desea que los cambios~/.profile
tengan 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
PATH
se 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ónPATH
y otras variables de entorno en Ubuntu, también recomiendo leerVariables de entornoy las otras respuestas a esta pregunta.
El lugar preferido para establecer PATH
depende 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 PATH
variable de entorno tendrá el valor que teníaasignado más recientemente. En la práctica,mayoríadel tiempo que establezcas PATH
, incluyes elviejovalor de PATH
en el nuevo valor, de modo que se conserven las entradas anteriores.
Por lo tanto, en la práctica, cuando PATH
se 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 PATH
variable misma, lo que hace que su valor anterior se incluya en el nuevo.
Por lo tanto, en realidad está solicitando el orden en que PATH
entran en vigor las configuraciones en varios archivos.
Los lugares comunes y de uso general que se pueden configurar PATH
se 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 .orig
extensió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
, .old
y .backup
son .bak
comunes).
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/environment
no 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_environment
los archivos por usuario (ver más abajo).
Cuando se establece la misma variable de entorno en /etc/environment
y /etc/security/pam_env.conf
, se utiliza 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 environment
por una en pam_env.conf
, puede incluir el contenido del valor reemplazado. Consulte la sección siguiente .pam_environment
para obtener más detalles (ya que utiliza la misma sintaxis).
Generalmente no es necesario editar pam_env.conf
ydebes 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.conf
contiene 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_environment
en 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_environment
en su directorio de inicio. Los valores establecidos en este archivo reemplazan a los establecidos en el /etc/environment
archivo global.
.pam_environment
no 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_environment
admiten 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 bin2
directorio 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_environment
subseccióndeVariables de entorno(del cual el ejemplo anterior está estrechamente adaptado),man pam_env
, yman pam_env.conf
para 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_environment
el 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-devel
discusió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_environment
será 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 sudo
rootear, aún puede ejecutarse y se le pedirá que ingrese su contraseña (no la suya). . Elsu your-account
invitadocuenta, sin embargo, no puede hacer esto, ya que está prohibido usarla su
para asumir la identidad de otro usuario).
4. Para todos los usuarios: /etc/profile
y archivos dentro/etc/profile.d/
Los shells compatibles con Bourne (incluido bash
, el shell de usuario predeterminado en Ubuntu) ejecutan los comandos /etc/profile
cuando se invocan como un shell de inicio de sesión.
Ubuntu /etc/profile
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 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/environment
y 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/profile
archivo 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/profile
y en uno o más archivos /etc/profile.d
, ¿cuál se realiza en último lugar?Esto depende de si los comandos en /etc/profile
ese conjunto aparecen antes o después de que profile.d
se hayan obtenido los archivos (según el código que cité anteriormente). Los comandos /etc/profile
se ejecutan en el orden en que aparecen.
/etc/profile
es 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 ~/.profile
archivo 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/environment
ni /etc/security/pam_env.conf
hacerlo. Esta es quizás la situación principal en la que es mejor utilizar /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 más abajo). Por lo general, no debería tener un .bash_profile
en 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 .profile
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 más 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
, normalmente no deberías tener un .bash_login
archivo en tu directorio de inicio.
7. Para un usuario: .profile
en 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/profile
los comandos en los archivos ; consulte más arriba). /etc/profile.d/
Después de eso, ejecuta los comandos en .profile
el directorio de inicio del usuario. Este archivo está separado para cada usuario. (Bash realmente se ejecuta .bash_profile
o, .bash_login
en 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.)
~/.profile
Por 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_environment
configurar 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_environment
ver arriba). Sin embargo, si necesita configurar PATH
de una manera más sofisticada, es posible que deba utilizar su .profile
lugar. En particular, si desea verificar si existe un directorio cada vez que un usuario inicia sesión y solo agregarlo PATH
si existe, entonces no podrá usar su .pam_environment
archivo para agregar ese directorio a su archivo PATH
.
Por ejemplo, el archivo predeterminado por usuario .profile
en 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 bin
subdirectorio 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 ~/.bashrc
y /etc/bash.bashrc
, porque generalmente no son lugares recomendados para configurar PATH
y 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 bash
es 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:
todo el sistema
/etc/profile
- No es buena idea editarlo directamente.
/etc/profile.d/*.sh
- obtenido por/etc/profile
toda la sesión
~/.profile
https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh