Desafortunadamente, no hay una ubicación totalmente portátil para establecer variables de entorno. Los dos archivos más cercanos son ~/.profile
, que es la ubicación tradicional y funciona de fábrica en muchas configuraciones, y ~/.pam_environment
una alternativa moderna, común pero limitada.
Que poner en ~/.pam_environment
~/.pam_environment
Todos los métodos de inicio de sesión que utilizan PAM leen el archivo y que tienen este archivo habilitado. Esto cubre la mayoría de los sistemas Linux hoy en día.
La principal ventaja de esto ~/.pam_environment
es que (cuando está habilitado) se lee antes de que se inicie el shell del usuario, por lo que funciona independientemente del tipo de sesión, el shell de inicio de sesión y otras complejidades. Incluso funciona para inicios de sesión no interactivos como su -c somecommand
y ssh somecommand
.
La principal limitación ~/.pam_environment
es que solo puede colocar tareas simples allí, no una sintaxis de shell compleja. La sintaxis de este archivo es la siguiente.
- Los archivos se analizan línea por línea.
- El espacio en blanco inicial se ignora.
- Opcionalmente, puede comenzar líneas con
export
y un solo espacio (no una pestaña, vaya figura).
- Después de eso, cada línea debe tener la forma
VAR=VALUE
donde VAR consiste en letras, dígitos y guiones bajos.
#
comienza un comentario, no puede aparecer en un valor.
- Si VALUE comienza con
'
o "
y contiene otra cita idéntica, entonces VAR se establece en la cadena entre las citas (se ignora todo después de la segunda cita). De lo contrario, VAR se establece en la cadena después del =
signo.
- Si no hay
=
, la variable se elimina del entorno.
Por otro lado, ~/.pam_environment
funciona en una gran variedad de circunstancias. En el lado negativo, no puede tener ninguna configuración dinámica, como basar el valor de una variable en otra variable (por ejemplo, agregar un directorio a PATH) o usar la salida de un comando (por ejemplo, probar si hay un directorio o programa), y algunos Los caracteres ( #'"
, nueva línea) son imposibles o problemáticos de poner en el valor.
Que poner en ~/.profile
Este archivo debe tener una sintaxis sh portátil (POSIX). Solo use extensiones ksh o bash (matrices, [[ … ]]
etc.) si sabe que su sistema tiene estos shells como /bin/sh
.
Este archivo puede leerse mediante scripts en aplicaciones automatizadas, por lo que no debe llamar a programas que producen ningún resultado o llamada exec
. Si desea hacerlo en los inicios de sesión en modo de texto, hágalo solo para shells interactivos. Ejemplo:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
Este es un ejemplo de uso /bin/sh
como su shell de inicio de sesión y cambiar a su shell favorito. Vea también cómo puedo usar bash como mi shell de inicio de sesión cuando mi administrador del sistema se niega a permitirme cambiarlo
¿Cuándo ~/.profile
no se lee en el inicio de sesión no gráfico?
Diferentes shells de inicio de sesión leen diferentes archivos.
Si su shell de inicio de sesión es bash
Bash lee ~/.bash_login
o ~/.bash_profile
si existen en lugar de ~/.profile
. Además, bash no lee ~/.bashrc
en un shell de inicio de sesión, incluso si es interactivo. Para no tener que recordar estos caprichos nuevamente, cree un ~/.bash_profile
con las dos líneas siguientes:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Consulte también ¿Qué archivos de configuración deben usarse para configurar variables de entorno con bash?
Si su shell de inicio de sesión es zsh
Zsh lee ~/.zprofile
y ~/.zlogin
, pero no ~/.profile
. Zsh tiene una sintaxis diferente de sh, pero puede leer ~/.profile
en modo de emulación sh. Puede usar esto para su ~/.zprofile
:
emulate sh -c '. ~/.profile'
Vea también Zsh no golpeando ~ / .profile
Si su shell de inicio de sesión es otro shell
No hay mucho que pueda hacer allí, aparte de usarlo /bin/sh
como su shell de inicio de sesión y su shell favorito (como fish) solo como un shell interactivo. Eso es lo que hago con zsh. Consulte más arriba para ver un ejemplo de invocación de otro shell ~/.profile
.
Comandos remotos
Al invocar un comando remoto sin pasar por un shell interactivo, no todos los shells leen un archivo de inicio.
Ksh lee el archivo especificado por la ENV
variable, si logra pasarlo.
Bash lee ~/.bashrc
si no es interactivo (!) Y su proceso padre se llama rshd
o sshd
. Para que pueda comenzar ~/.bashrc
con
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh siempre lee ~/.zshenv
cuando comienza. Úselo con precaución, ya que esto se lee en cada instancia de zsh, incluso cuando es una subshell donde ha establecido otras variables. Si zsh es su shell de inicio de sesión y desea usarlo para establecer variables solo para comandos remotos, use una protección: configure algunas variables ~/.profile
, como MY_ENVIRONMENT_HAS_BEEN_SET=yes
, y verifique esta protección antes de leer ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
El caso de los inicios de sesión gráficos
Muchas distribuciones, administradores de pantalla y entornos de escritorio organizan la ejecución ~/.profile
, ya sea explícitamente desde las secuencias de comandos de inicio o ejecutando un shell de inicio de sesión.
Desafortunadamente, no existe un método general para manejar combinaciones de distribución / DM / DE donde ~/.profile
no se lee.
Si usa una sesión tradicional iniciada por ~/.xsession
, este es el lugar donde debe establecer sus variables de entorno; hacerlo por abastecimiento ~/.profile
(es decir . ~/.profile
). Tenga en cuenta que en algunas configuraciones, los scripts de inicio del entorno de escritorio se volverán a generar ~/.profile
.