¿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?
environment-variables
paths
pkaramol
fuente
fuente

Respuestas:
Resumen:
Si desea agregar una ruta (por ejemplo
/your/additional/path) a suPATHvariable 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: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. Sinrootembargo, es propiedad de él , por lo que debe ser un usuario administrador y usarlosudopara 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: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 laPATHvariable 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
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:
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
fuente
~/.profileno se comprueba la existencia de~/bin, pero simplemente tiene la línea:PATH="$HOME/bin:$HOME/.local/bin:$PATH"/etc/skel/.profileen 16.04 tiene la línea que mencioné. Aparentemente creaste tu usuario en una versión anterior.~/.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).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 establecidoPATH, que incluyen la edad, el valor dePATHen 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 laPATHvariable 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 establecerPATHen 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/environmentPAM 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.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
.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.confPAM 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 enDEFAULTlugar deOVERRIDE.Sin embargo, cuando reemplaza una línea
environmentcon una entradapam_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 predeterminadopam_env.confcontiene 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_environmenten 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_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 comoPATH. 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 finalPATH, puede hacerlo agregando esta línea a.pam_environment:Consulte la
~/.pam_environmentsubsección de Variables de entorno (de la cual el ejemplo anterior está muy adaptado)man pam_env, yman 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-develTal 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ó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
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-accountsu4. 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: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 queprofile.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 usuarioSi 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 usuarioSi 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 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_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 establecePATHen.pam_environment(ver más arriba). Sin embargo, si necesita configurarPATHde 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 agregaPATHsi es así, entonces no podrá usar su.pam_environmentarchivo para agregar ese directorio a suPATH.Por ejemplo, el
.profilearchivo 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
binsubdirectorio 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
~/.bashrcy/etc/bash.bashrc, porque generalmente no son lugares recomendados para configurarPATHy 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
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 comotcsh.fuente
/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./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).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/environmentpuesto que no hay peligro de acceso no autorizado./etc/environment, pero~/.profilerelació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.fuente