¿Diferencia entre el Shell de inicio de sesión y el Shell de no inicio de sesión?

258

Entiendo la diferencia básica entre un shell interactivo y un shell no interactivo. Pero, ¿qué diferencia exactamente a 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 shell interactivo sin inicio de sesión ?

    
pregunta Igorio 08.05.2012 - 22:57

4 respuestas

262

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 de shell, con un carácter - ante (por ejemplo, -bash mientras que normalmente sería bash Los shells de inicio de sesión suelen leer un archivo que hace cosas como configurar variables de entorno: /etc/profile y ~/.profile para el shell Bourne tradicional, ~/.bash_profile además 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, a través de SSH, o con su - , obtiene un shell inicio de sesión interactivo . Cuando inicia sesión en modo gráfico (en un X administrador de pantalla ), no obtiene un inicio de sesión shell, en lugar de eso, obtienes 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 inicias 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 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 la variable ENV para Los shells compatibles con POSIX / XSI como dash, ksh y bash cuando se invocan como sh , $ENV si se establecen y ~/.mkshrc para mksh, etc.).

Cuando un shell ejecuta un script o un comando que pasa 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 ese otro programa. Algunos shells leen un archivo de inicio en este caso (bash ejecuta el archivo indicado por la variable BASH_ENV , zsh ejecuta /etc/zshenv y ~/.zshenv ), pero esto es riesgoso: el shell se puede invocar en todo tipo de contextos, y No hay casi nada que puedas hacer que no pueda romper algo.

Estoy simplificando un poco, consulte el manual para los detalles sangrientos.

    
respondido por el Gilles 01.09.2012 - 04:07
34

Para saber si estás en un shell de inicio de sesión:

prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.

prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.

La información se puede encontrar en man bash (buscar Invocación). Aquí hay un extracto:

  

Un shell de inicio de sesión es uno cuyo primer carácter del argumento cero es un -, o   uno comenzó con la opción --login.

Usted puede probar esto usted mismo. Cada vez que usted SSH, está utilizando un shell de inicio de sesión. Por ejemplo:

prompt> ssh user@localhost
fervor@localhost's password:
prompt> echo $0
-bash

La importancia de usar un shell de inicio de sesión es la configuración que se ejecutará en /home/user/.bash_profile . Aquí hay un poco más de información si está interesado (de man bash )

"Cuando se invoca a bash como un shell de inicio de sesión interactivo, o como un shell no interactivo con la opción --login, primero lee y ejecuta comandos desde el archivo / etc / profile, si ese archivo existe. Después de leer ese archivo, busca ~/.bash_profile , ~/.bash_login y ~/.profile , en ese orden, y lee y ejecuta los comandos desde el primero que existe y es legible. La opción --noprofile se puede usar cuando se inicia el shell para inhibir este comportamiento ".

    
respondido por el Timothy Pulliam 21.10.2015 - 16:46
23

En un shell 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". P.ej. un shell, que no es un shell de inicio de sesión, no ejecutaría un comando de "cierre de sesión".

    
respondido por el BOPOHOK 09.05.2012 - 00:57
18

Un shell iniciado en un nuevo terminal en una GUI sería un shell interactivo sin inicio de sesión. Sería fuente de su .bashrc, pero no su .profile, por ejemplo.

    
respondido por el Julian 09.05.2012 - 00:20

Lea otras preguntas en las etiquetas