GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuál es la mejor forma independiente de distro/shell para establecer variables de entorno?

La pregunta lo dice todo. Actualmente uso Arch Linux y zsh, pero me gustaría una solución que (como mínimo) funcione tanto en VT como en xterms y también (con suerte, preferiblemente) seguirá funcionando si cambio de distribución o shell.

He escuchado respuestas muy dispares a esta pregunta en documentos de diferentes distribuciones. Ubuntu dice "usar .pam_environment". Creo que en Arch lo que recomiendan depende de tu caparazón. Actualmente pongo todo en .profile y si un shell no lo obtiene por algún motivo (por ejemplo, bash si existe .bash_profile), lo anulo al buscarlo manualmente. Pero parece que debe haber una mejor manera.

Respuesta aceptada:

Desafortunadamente, no existe una ubicación totalmente portátil para establecer variables de entorno. Los dos archivos que más se acercan son ~/.profile , que es la ubicación tradicional y funciona de forma inmediata en muchas configuraciones, y ~/.pam_environment , una alternativa moderna, común pero limitada.

Qué poner en ~/.pam_environment

El archivo ~/.pam_environment es leído por todos los métodos de inicio de sesión que usan PAM y que tienen este archivo habilitado. Esto cubre la mayoría de los sistemas Linux en la actualidad.

La principal ventaja de ~/.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, 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 de ~/.pam_environment es que solo puede poner asignaciones 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.
  • Cada línea debe tener la forma VAR=VALUE donde VAR consta de letras, dígitos y guiones bajos. La forma alternativa VAR DEFAULT=value permite expansiones de variables de entorno usando ${VAR} sintaxis y las variables especiales @{HOME} y @{SHELL} .
  • # comienza un comentario, no puede aparecer en un valor.
  • Si VALUE está rodeado por " , entonces VAR se establece en la cadena entre comillas.
  • $ o @ inserta un literal $ o @ y las líneas largas se pueden dividir escapando de la nueva línea con un .
  • Si hay un error de sintaxis como no = o espacios en blanco sin comillas, la variable se elimina del entorno.

Entonces, en el lado positivo, ~/.pam_environment funciona en una gran variedad de circunstancias. La desventaja es que no puede usar la salida de un comando (por ejemplo, probar si un directorio o programa está presente) y algunos caracteres (#" , nueva línea) son imposibles o problemáticos para poner el valor.

Qué poner en ~/.profile

Este archivo debe tener la sintaxis sh portátil (POSIX). Utilice únicamente extensiones ksh o bash (matrices, [[ … ]] , etc.) si sabe que su sistema tiene estos shells como /bin/sh .

Este archivo puede ser leído por secuencias de comandos en aplicaciones automatizadas, por lo que no debe llamar a programas que produzcan ningún resultado ni llamar a exec . Si desea hacer eso en inicios de sesión en modo 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 del uso de /bin/sh como su shell de inicio de sesión y cambiando a su shell favorito. Vea también cómo puedo usar bash como mi shell de inicio de sesión cuando mi administrador de sistemas se niega a permitirme cambiarlo

Relacionado:¿Cómo configurar una combinación de teclas en todo el sistema para alternar una configuración específica de Preferencias del sistema ("Tocar para hacer clic")?

¿Cuándo es ~/.profile? no se lee en el inicio de sesión no gráfico?

Diferentes shells de inicio de sesión leen archivos diferentes.

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 nunca más estas peculiaridades, crea un ~/.bash_profile con las siguientes dos líneas:

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

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 el modo de emulación sh. Puede usar esto para su ~/.zprofile :

emulate sh -c '. ~/.profile'

Si su shell de inicio de sesión es otro shell

No hay mucho que puedas hacer allí, aparte de usar /bin/sh como su caparazón de inicio de sesión y su caparazón favorito (como pez) solo como un caparazón interactivo. Eso es lo que hago con zsh. Vea arriba un ejemplo de cómo invocar otro shell desde ~/.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 ENV variable, si logras pasarla.

Bash lee ~/.bashrc si es no interactivo (!) y su proceso principal se llama rshd o sshd . Para que pueda iniciar su ~/.bashrc con

if [[ $- != *i* ]]; then
  . ~/.profile
  return
fi

Zsh siempre lee ~/.zshenv cuando empieza Úselo con precaución, ya que cada instancia de zsh lo lee, incluso cuando se trata de una subcapa en la que 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 un protector:establezca alguna variable en ~/.profile , como MY_ENVIRONMENT_HAS_BEEN_SET=yes y verifique este protector 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 se organizan para ejecutar ~/.profile , ya sea extrayéndolo explícitamente de los scripts 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; hazlo obteniendo ~/.profile (es decir, . ~/.profile ). Tenga en cuenta que en algunas configuraciones, los scripts de inicio del entorno de escritorio generarán ~/.profile de nuevo.


Linux
  1. Cómo establecer/crear variables de entorno y shell en Linux

  2. ¿Cuál es la mejor manera de sacar un segmento de un archivo de texto?

  3. ¿La diferencia en el uso entre las variables de shell y las variables de entorno?

  4. ¿Cuál es la mejor manera de contar el número de archivos en un directorio?

  5. Manera de recuperar el nombre del entorno de escritorio??

Cómo establecer la variable de entorno en Windows

Cómo establecer variables de entorno en MacOS

Cómo establecer y enumerar variables de entorno en Linux

Y la mejor distro de 2019 es...

Cómo configurar y desactivar variables de entorno en Linux

La ejecución de crontab no tiene las mismas variables de entorno que el usuario que ejecuta