Entiendo la diferencia básica entre un shell interactivo y un shell no interactivo. Pero, ¿qué diferencia exactamente un shell de inicio de sesión de un shell que no es de inicio de sesión?
¿Puede dar ejemplos de usos de un interactivo sin inicio de sesión? concha?
Respuesta aceptada:
Un shell de inicio de sesión es el primer proceso que se ejecuta bajo 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 hace 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
por dinero en efectivo, etc.
Cuando inicia sesión en una consola de texto, o a través de SSH, o con su -
, obtienes un inicio de sesión interactivo cáscara. Cuando inicia sesión en modo gráfico (en un administrador de pantalla X), no obtiene un shell de inicio de sesión, sino un administrador de sesión o un administrador de ventanas.
Es raro ejecutar un inicio de sesión no interactivo shell, pero algunas configuraciones de X hacen eso 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 visualización) lea /etc/profile
y ~/.profile
explícitamente, o no los lea. Otra forma de obtener un shell de inicio de sesión no interactivo es iniciar sesión de forma remota con un comando pasado a través de una entrada estándar que no es una terminal, p. 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 y sin inicio de sesión).
Cuando inicia un shell en una terminal en una sesión existente (pantalla, terminal X, búfer de terminal de Emacs, un shell dentro de otro, etc.), obtiene un interactivo, sin inicio de sesión cáscara. Ese shell podría 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 ENV
variable para shells compatibles con POSIX/XSI como dash, ksh y bash cuando se invoca como sh
, $ENV
si está establecido y ~/.mkshrc
para mksh, etc.).
Cuando un shell ejecuta un script o un comando pasado en su línea de comando, es un no interactivo, sin inicio de sesión cáscara. Tales shells se ejecutan todo el tiempo:es muy común que cuando un programa llama a otro programa, en realidad 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 BASH_ENV
variable, zsh 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 rompa algo.
Estoy simplificando un poco, vea el manual para los detalles sangrientos.