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,-bash
mientras que normalmente seríabash
. 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 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 (
~/.bashrc
para bash invocado comobash
,/etc/zshrc
y~/.zshrc
para zsh,/etc/csh.cshrc
y~/.cshrc
para csh, el archivo indicado por laENV
variable para shells compatibles con POSIX / XSI como dash, ksh y bash cuando se invoca comosh
,$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.
fuente
bash
un shell de inicio de sesión no interactivo?echo $- | bash -lx
FOO
es una variable de entorno (es decir,.profile
contieneexport FOO=something
), está disponible para todos los subprocesos, incluidosfoo.sh
. Si cambia.profile
aexport FOO=something_else
,./foo.sh
se imprimirásomething
hasta 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
on
en 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_profile
se 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 $0
comienza con-
, es shell de inicio de sesión (echo $0
ejemplo de salida:)-bash
. De lo contrario, es un shell sin inicio de sesión (echo $0
ejemplo 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
-t
interruptorPuede solicitar explícitamente el shell interactivo cuando desee ejecutar el comando de forma remota a través de ssh utilizando el
-t
interruptor.Nota: sobre el tema de por qué ejecutar comandos de forma remota no hay
login shell
más información aquí .fuente