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, -bashmientras que normalmente sería bash. Los shells de inicio de sesión normalmente leen un archivo que cosas como establecer variables de entorno: /etc/profiley ~/.profilepara el shell Bourne tradicional, ~/.bash_profileadicionalmente para bash † , /etc/zprofiley ~/.zprofilepara zsh † , /etc/csh.loginy ~/.loginpara 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/profiley ~/.profileexplí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 ( ~/.bashrcpara bash invocado como bash, /etc/zshrcy ~/.zshrcpara zsh, /etc/csh.cshrcy ~/.cshrcpara csh, el archivo indicado por la ENVvariable para shells compatibles con POSIX / XSI como dash, ksh y bash cuando se invoca como sh, $ENVsi está configurado y ~/.mkshrcpara 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_ENVvariable, zsh se ejecuta /etc/zshenvy ~/.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.