Un shell de inicio de sesión es el primer proceso que se ejecuta con su ID de usuario cuando inicia sesión para una sesión interactiva. El proceso de inicio de sesión le dice al shell que se comporte como un shell de inicio de sesión con una convención: pasar el argumento 0, que normalmente es el nombre del ejecutable del shell, con un -
carácter antepuesto (por ejemplo, -bash
mientras que normalmente sería bash
. Los shells de inicio de sesión normalmente leen un archivo que cosas como establecer variables de entorno: /etc/profile
y ~/.profile
para el shell Bourne tradicional, ~/.bash_profile
adicionalmente para bash † , /etc/zprofile
y ~/.zprofile
para zsh † , /etc/csh.login
y ~/.login
para csh, etc.
Cuando inicia sesión en una consola de texto, o a través de SSH, o con su -
, obtiene un shell de inicio de sesión interactivo . Cuando inicia sesión en modo gráfico (en un administrador de pantalla X ), no obtiene un shell de inicio de sesión, sino que obtiene un administrador de sesión o un administrador de ventanas.
Es raro ejecutar un shell de inicio de sesión no interactivo , pero algunas configuraciones de X lo hacen cuando inicia sesión con un administrador de pantalla, para organizar la lectura de los archivos de perfil. Otras configuraciones (esto depende de la distribución y del administrador de pantalla) leen /etc/profile
y ~/.profile
explícitamente, o no las leen. Otra forma de obtener un shell de inicio de sesión no interactivo es iniciar sesión de forma remota con un comando que se pasa a través de una entrada estándar que no es un terminal, por ejemplo ssh example.com <my-script-which-is-stored-locally
(a diferencia de ssh example.com my-script-which-is-on-the-remote-machine
, que ejecuta un shell no interactivo, sin inicio de sesión).
Cuando inicia un shell en un terminal en una sesión existente (pantalla, terminal X, búfer de terminal Emacs, un shell dentro de otro, etc.), obtiene un shell interactivo sin inicio de sesión . Ese shell puede leer un archivo de configuración de shell ( ~/.bashrc
para bash invocado como bash
, /etc/zshrc
y ~/.zshrc
para zsh, /etc/csh.cshrc
y ~/.cshrc
para csh, el archivo indicado por la ENV
variable para shells compatibles con POSIX / XSI como dash, ksh y bash cuando se invoca como sh
, $ENV
si está configurado y ~/.mkshrc
para mksh, etc.).
Cuando un shell ejecuta un script o un comando pasado en su línea de comando, es un shell no interactivo, sin inicio de sesión . Tales shells se ejecutan todo el tiempo: es muy común que cuando un programa llama a otro programa, realmente ejecuta un pequeño script en un shell para invocar a ese otro programa. Algunos shells leen un archivo de inicio en este caso (bash ejecuta el archivo indicado por la BASH_ENV
variable, zsh se ejecuta /etc/zshenv
y ~/.zshenv
), pero esto es arriesgado: el shell se puede invocar en todo tipo de contextos, y casi no hay nada que pueda hacer que no romper algo.
† Estoy simplificando un poco, mira el manual para los detalles sangrientos.