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 sin inicio de sesión?
¿Puede dar ejemplos de usos de un shell interactivo sin inicio de sesión ?

Respuestas:
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íabash. 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 ejemplossh example.com <my-script-which-is-stored-locally(a diferencia dessh 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 comobash,/etc/zshrcy~/.zshrcpara zsh,/etc/csh.cshrcy~/.cshrcpara csh, el archivo indicado por laENVvariable para shells compatibles con POSIX / XSI como dash, ksh y bash cuando se invoca comosh,$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.
fuente
bashun shell de inicio de sesión no interactivo?echo $- | bash -lxFOOes una variable de entorno (es decir,.profilecontieneexport FOO=something), está disponible para todos los subprocesos, incluidosfoo.sh. Si cambia.profileaexport FOO=something_else,./foo.shse imprimirásomethinghasta la próxima vez que inicie sesión.Para saber si está en un shell de inicio de sesión:
En Bash, también puedes usar
shopt login_shell:(o
onen un shell de inicio de sesión).Se puede encontrar información en
man bash(buscar Invocación). Aquí hay un extracto:Puedes probar esto tú mismo. Cada vez que utiliza SSH, está utilizando un shell de inicio de sesión. Por ejemplo:
La importancia de usar un shell de inicio de sesión es que cualquier configuración
/home/user/.bash_profilese ejecutará. Aquí hay un poco más de información si está interesado (deman bash)fuente
En una cáscara de inicio de sesión,
argv[0][0] == '-'. Así es como sabe que es un shell de inicio de sesión.Y luego, en algunas situaciones, se comporta de manera diferente dependiendo de su estado de "shell de inicio de sesión". Por ejemplo, un shell, que no es un shell de inicio de sesión, no ejecutaría un comando "cerrar sesión".
fuente
man bash, con énfasis agregado, "un shell de inicio de sesión es aquel cuyo primer carácter del argumento cero es un -, o uno comenzó con la opción --login " .Un shell iniciado en una nueva terminal en una GUI sería un shell interactivo sin inicio de sesión. Obtendría su .bashrc, pero no su .profile, por ejemplo.
fuente
Explicaré la gran respuesta de Gilles, combinada con el método de Timothy para verificar el tipo de shell de inicio de sesión.
Si te gusta ver las cosas por ti mismo, prueba los siguientes fragmentos y escenarios.
Comprobando si el shell es (no) interactivo
Comprobando si shell es (no) inicio de sesión
Si la salida de
echo $0comienza con-, es shell de inicio de sesión (echo $0ejemplo de salida:)-bash. De lo contrario, es un shell sin inicio de sesión (echo $0ejemplo de salida:)bash.Combinemos los dos anteriores para obtener ambas piezas de información a la vez:
Escenarios:
Sesión SSH típica sin opciones especiales.
Ejecutar script o ejecutar explícitamente a través de un nuevo shell
Ejecutar script local de forma remota
Ejecutar un comando sobre ssh de forma remota
Ejecutar un comando sobre ssh de forma remota con el
-tinterruptorPuede solicitar explícitamente el shell interactivo cuando desee ejecutar el comando de forma remota a través de ssh utilizando el
-tinterruptor.Nota: sobre el tema de por qué ejecutar comandos de forma remota no hay
login shellmás información aquí .fuente