¿Por qué tenemos shells de inicio de sesión, no inicio de sesión, interactivo y no interactivo?

23

Entonces, las páginas de manual de bash explican qué son los login y shells interactivos:

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

Un shell interactivo es uno que se inicia sin argumentos sin opciones y sin la opción -c, cuya entrada estándar y error están conectados a los terminales (según lo determinado por isatty (3)), o uno que comienza con la opción -i. PS1 está configurado y $: incluye i si bash es interactivo, lo que permite que un script de shell o un archivo de inicio pruebe este estado.

Creo que esto significa que podemos tener 4 tipos diferentes de conchas:

  • Conchas de inicio de sesión interactivas,
  • Shells de inicio de sesión no interactivos,
  • Shells interactivos sin inicio de sesión,
  • Shells no interactivos sin inicio de sesión

Pero, ¿por qué tenemos shells interactivos / no interactivos y de inicio de sesión / no inicio de sesión en primer lugar? ¿Por qué la variedad? ¿Qué perderíamos si solo tuviéramos un tipo de caparazón?

Además, cuando intento determinar si estoy en un shell de inicio de sesión ejecutando echo $-, genera:

himBH

Algunos de estos indicadores se explican aquí , pero h, Hy mno se explican. ¿Hay un lugar que describa todas estas banderas?

TheFooProgrammer
fuente

Respuestas:

21

Estos son mis pensamientos sobre los diferentes "tipos" de proyectiles: desafortunadamente no presencié el surgimiento de la Un * x desde el principio (supongo que este concepto ha crecido históricamente en buena medida), así que sea crítico.

  • Cuando inicio sesión en un sistema (hoy en día a través del inicio de sesión gráfico X), podría haber algunas tareas que deberían ejecutarse una vez, por ejemplo, establecer una conexión a algún tipo de servidor, presentarme la lista de tareas pendientes de hoy, iniciar automáticamente algunos comandos, etc. Esto No debería ocurrir cada vez que abro una nueva terminal. Así que hay un conjunto de archivos de configuración ( /etc/profile, ~/.bash_loginetc., consulte el manual para una lista exacta) proceden únicamente de inicio de sesión conchas.
  • En consecuencia, para cerrar las conexiones, elimine algunos programas, ejecute un script de respaldo ~/.bash_logoutcuando exista el shell de inicio de sesión .
  • por lo tanto, el shell "normal" que uso en un terminal no debería incluir un shell de inicio de sesión , pero debería leer mis preferencias personales ~/.bashrc, porque quiero que mis combinaciones de teclas interactúen con el shell, por lo tanto, este es un elemento interactivo shell de inicio de sesión
  • y por último, pero no menos importante cuando bash se usa para secuencias de comandos, nada de esto es importante. bashdebería comenzar lo más rápido posible, es decir, no debería leer ningún archivo de configuración. Este es un shell no interactivo, sin inicio de sesión .

Entonces, mi respuesta a su pregunta ¿Qué perderíamos si solo tuviéramos un tipo de caparazón? está en una palabra: "Flexibilidad".


La respuesta a su segunda pregunta es fácil:

$-enumera el conjunto actual de opciones. Estos pueden configurarse mediante parámetros de línea de comando ao bashmediante el setincorporado. Así que debes mirar dos lugares en el manual:

  • OPTIONS sección:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSsección, subsección set:

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.
mpy
fuente
1
Woo, creo que la respuesta @mpy a la pregunta claramente formulada de OP es capaz de desambiguar con éxito una definición bastante útil. Acerca de eso: Entonces, un shell sin inicio de sesión solo es un subconjunto del shell de inicio de sesión ¿verdad?
tuk0z