¿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?
environment-variables
paths
pkaramol
fuente
fuente
Respuestas:
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 Me~/.profile
gusta en uno de esos dos ejemplos: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/environment
pero crear un archivo con el nombre que termine.sh
en/etc/profile.d/
. El/etc/profile
script y todos los scripts en/etc/profile.d
son el equivalente global del personal de cada usuario~/.profile
y se ejecutan como scripts de shell normales por todos los shells durante su inicialización.Mas detalle:
/etc/environment
es un archivo de configuración de todo el sistema, lo que significa que es utilizado por todos los usuarios. Sinroot
embargo, es propiedad de él , por lo que debe 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 otros./etc/profile
y/etc/profile.d/*.sh
son los scripts de inicialización global que son equivalentes~/.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 solo esta línea:Establece la
PATH
variable 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/bin
y/usr/sbin
desde 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
~/.profile
archivo puede contener muchas cosas, por defecto contiene, entre otras cosas, una comprobación de si~/bin
existe un directorio y lo agrega a laPATH
variable 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"):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 solo por los shells del usuario al que pertenece, pero hay otra condición:
Por lo tanto, si usa el shell Bash predeterminado, debe asegurarse de que no tiene un
~/.bash_profile
o~/.bash_login
si desea que los cambios~/.profile
tengan 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
fuente
~/.profile
no se comprueba la existencia de~/bin
, pero simplemente tiene la línea:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
/etc/skel/.profile
en 16.04 tiene la línea que mencioné. Aparentemente creaste tu usuario en una versión anterior.~/.profile
todavía tenía esto también, pero tienes razón,/etc/skel/.profile
no 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
).El lugar preferido para configurar
PATH
depende 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
PATH
variable de entorno tendrá el valor que se le asignó más recientemente . En la práctica, la mayor parte del tiempo establecidoPATH
, que incluyen la edad, el valor dePATH
en el nuevo valor, de modo que las entradas anteriores se mantienen.Por lo tanto, en la práctica, cuando
PATH
se 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 laPATH
variable 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
PATH
tienen efecto las configuraciones en varios archivos.Los lugares comunes de uso general para configurar
PATH
se 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 establecerPATH
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/environment
se 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.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:
La
.orig
extensió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
,.backup
y.bak
son 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/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 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_environment
archivos por usuario (ver más abajo).Cuando se establece la misma variable de entorno en ambos
/etc/environment
y/etc/security/pam_env.conf
,pam_env.conf
se utiliza el valor en , incluso si ese valor se especifica como enDEFAULT
lugar deOVERRIDE
.Sin embargo, cuando reemplaza una línea
environment
con una entradapam_env.conf
, puede incluir el contenido del valor reemplazado. Consulte la siguiente sección.pam_environment
para obtener más detalles (ya que usa la misma sintaxis).Por lo general, no es necesario editar
pam_env.conf
y 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 predeterminadopam_env.conf
contiene las líneas: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:¡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_environment
en el directorio de inicio del usuarioUna 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 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 establecer variables de entorno comoPATH
. A diferencia/etc/environment
(pero similar/etc/security/pam_env.conf
), los.pam_environment
archivos 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
bin2
directorio en su directorio personal que desea agregar al finalPATH
, puede hacerlo agregando esta línea a.pam_environment
:Consulte la
~/.pam_environment
subsección de Variables de entorno (de la cual el ejemplo anterior está muy adaptado)man pam_env
, yman pam_env.conf
para 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_environment
archivo 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_environment
será tan malo como un error de ediciónpam_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
sudo
rootear, 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-account
su
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.d
termina con:Esto hace que los comandos en cualquier archivo en el
/etc/profile.d/
directorio cuyo nombre termine también.sh
se 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/environment
y 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/profile
archivo 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/profile
y 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 queprofile.d
se hayan obtenido los archivos (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 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~/.profile
archivo 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/environment
ni/etc/security/pam_env.conf
hacerlo. Esta es quizás la situación principal donde es mejor usar/etc/profile
o en su/etc/profile.d/
lugar.5. Para un usuario:
.bash_profile
en el directorio de inicio del usuarioSi un usuario lo ha hecho
~/.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, generalmente debería contener un comando de origen
~/.profile
(por ejemplo,. "$HOME/.profile"
). De lo contrario, el contenido del.profile
archivo por usuario no se ejecuta en absoluto.6. Para un usuario:
.bash_login
en el directorio de inicio del usuarioSi un usuario lo ha hecho
~/.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
, generalmente no debe tener un.bash_login
archivo en su directorio de inicio.7. Para un usuario:
.profile
en 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.profile
en el directorio de inicio del usuario. Este archivo es independiente para cada usuario. (Bash realmente se ejecuta.bash_profile
o, en.bash_login
cambio, 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 ).~/.profile
es, por lo tanto, el lugar principal para que el usuario ponga comandos que se ejecutan cuando inician sesión. Es el lugar tradicional para configurarPATH
, 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_environment
para establecer las variables de entorno (tanto como uno puede preferir/etc/environment
a/etc/profile
).Puede ampliar las variables de entorno, incluyendo
PATH
sí mismo, cuando se establecePATH
en.pam_environment
(ver más arriba). Sin embargo, si necesita configurarPATH
de 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 agregaPATH
si es así, entonces no podrá usar su.pam_environment
archivo para agregar ese directorio a suPATH
.Por ejemplo, el
.profile
archivo predeterminado por usuario en Ubuntu solía terminar con:Vea el comentario de Gunnar Hjalmarsson sobre la respuesta de Byte Commander para más detalles.
Esto verifica si tiene un
bin
subdirectorio de su directorio personal. Si es así, agrega ese subdirectorio al comienzo de suPATH
.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
~/.bashrc
y/etc/bash.bashrc
, porque generalmente no son lugares recomendados para configurarPATH
y es raro que realmente los use para este propósito. Si usa estos archivos para agregar directoriosPATH
, 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
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 de estilo no Bourne comotcsh
.fuente
/etc/environment
/~/.pam_environment
como 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./etc/profile.d/*.sh
/~/.profile
son 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).pam_env.so
, ¿querías decirpam_env.conf
?pam_env.conf
. ¡Gracias! He editado para arreglarlo.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.
fuente
El lugar preferido para establecer variables ambientales depende de varias cosas:
/etc/environment
puesto que no hay peligro de acceso no autorizado./etc/environment
, pero~/.profile
relación con cada usuario del sistema, ya que está ubicado en el directorio de inicio de cada usuario.El sistema leerá
/etc/environment
antes 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
~/.profile
y cómo/etc/environment
jugar con otras ubicaciones similares, vaya aquí y aquí , ya que estos factores influirán en la forma en que utilice estas ubicaciones.fuente