HOWTO · Linux

Diferencia entre un shell de inicio de sesión y un shell sin inicio de sesión

Este tutorial explica la diferencia entre un shell de inicio de sesión y un shell sin inicio de sesión en sistemas basados en UNIX.

En esta página

Un shell de inicio de sesión y un shell sin inicio de sesión difieren en la forma en que se iniciaron, lo que afecta a la configuración de inicio. Esta guía explica la diferencia en sistemas basados en UNIX y usa Bash para mostrar cómo comprobar el estado del shell y elegir cómo invocarlo. El modo de inicio de sesión es independiente de que el shell sea interactivo.

¿Qué es un shell?

Un shell es un programa que lee comandos y solicita al sistema operativo que los ejecute. Bash es uno de los shells más comunes. Un shell también puede leer archivos de configuración que establecen variables, definen alias y configuran el indicador. Los archivos que Bash lee dependen de cómo se haya invocado; por eso, un mismo usuario puede ver configuraciones distintas en sesiones diferentes.

Aquí importan dos propiedades: un shell es un shell de inicio de sesión cuando se invoca en modo de inicio de sesión, y es interactivo cuando lee comandos desde un indicador destinado al usuario. Estas propiedades son independientes. Un terminal puede iniciar un shell interactivo sin inicio de sesión, y un script puede iniciar un shell no interactivo.

Shells de inicio de sesión y shells sin inicio de sesión

Un shell de inicio de sesión es un shell invocado en modo de inicio de sesión. En Bash, esto incluye una invocación con --login o un nombre de invocación propio de un inicio de sesión. Este estado describe cómo se invocó el shell; por sí solo, no demuestra que se haya producido una autenticación ni que haya comenzado una sesión de usuario. Un inicio de sesión en una consola de texto, SSH y las herramientas para cambiar de usuario son contextos habituales en los que puede iniciarse un shell de inicio de sesión, según el comando y la configuración. El shell no se define como el primer proceso iniciado por /bin/login; ese programa es una parte posible del proceso de inicio de sesión.

Un shell sin inicio de sesión se inicia sin el modo de inicio de sesión. Suele aparecer cuando un shell interactivo inicia otro shell o cuando un emulador de terminal abre un nuevo indicador. Un shell iniciado para ejecutar un comando o un script suele ser no interactivo, y no necesariamente es un shell de inicio de sesión. Son patrones habituales, no garantías para todos los terminales o servicios.

Propiedad Shell de inicio de sesión Shell sin inicio de sesión
Significado Invocado en modo de inicio de sesión Invocado sin modo de inicio de sesión
Configuración habitual Archivos de inicio de sesión Bash interactivo suele leer ~/.bashrc
Propiedad independiente Puede ser interactivo o no interactivo Puede ser interactivo o no interactivo

Diferencias entre los archivos de inicio de Bash

En Bash, un shell de inicio de sesión lee /etc/profile y, después, el primer archivo de usuario legible de esta lista: ~/.bash_profile, ~/.bash_login y ~/.profile. Estos archivos pueden cargar otras configuraciones. Bash no carga siempre ~/.bashrc desde un archivo de inicio de sesión; los usuarios suelen añadir esa línea por su cuenta. Un Bash interactivo sin inicio de sesión lee ~/.bashrc. Un Bash no interactivo usa BASH_ENV cuando esa variable indica un archivo. Los archivos de la distribución, como /etc/bashrc o los que están en /etc/profile.d, se incluyen mediante la configuración del sistema o del usuario en algunos sistemas; no forman parte de una secuencia universal de Bash.

El orden importa porque las asignaciones posteriores pueden reemplazar valores anteriores. Si una configuración aparece en un tipo de sesión, pero no en otro, primero identifica si el shell está en modo de inicio de sesión y si es interactivo; después, comprueba el archivo de inicio correspondiente y los archivos que este cargue. Los cambios en los archivos de inicio afectan a los shells futuros, pero no actualizan automáticamente uno que ya está en ejecución.

Cómo identificar e iniciar cada tipo de shell

En Bash, la opción del shell login_shell permite comprobar directamente el modo de inicio de sesión. shopt -q devuelve un estado de éxito cuando la opción está activada. El nombre $0 puede comenzar por - en un shell de inicio de sesión, pero los programas y envoltorios pueden cambiar ese nombre; por tanto, es una pista, no una comprobación definitiva. Para comprobar la interactividad por separado, busca la bandera i en $-.

Ejecuta este ejemplo de Bash para inspeccionar el shell actual e iniciar un shell hijo con un modo explícito:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

printf 'Current Bash login status: '
if shopt -q login_shell; then
  printf 'login\n'
else
  printf 'non-login\n'
fi

printf 'Child Bash login status: '
bash --login -c 'if shopt -q login_shell; then printf "login\\n"; else printf "non-login\\n"; fi'

case $- in
  *i*) printf 'Current Bash is interactive\n' ;;
  *)   printf 'Current Bash is non-interactive\n' ;;
esac

Las etiquetas y la salida visibles en el ejemplo permanecen en inglés porque los bloques de código y salida se conservan sin cambios.

Current Bash login status: non-login
Child Bash login status: login
Current Bash is non-interactive

Usa bash --login para solicitar un Bash en modo de inicio de sesión y bash para iniciar uno sin ese modo. Añade -i cuando necesites específicamente un shell hijo interactivo; un shell interactivo no es automáticamente un shell de inicio de sesión. Por ejemplo, bash --login -i solicita ambas propiedades. Para probar el comportamiento de inicio, usa un shell nuevo y ten en cuenta la configuración local, que puede cargar archivos adicionales.

Ilustración de un terminal con la etiqueta shell de inicio de sesión

Ilustración de un terminal con la etiqueta shell sin inicio de sesión