¿POR QUÉ un shell ** login ** sobre un shell ** non-login **?


24

Tengo una comprensión básica de los archivos de puntos en el sistema * nix. ¿Pero todavía estoy bastante confundido acerca de esta diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?

Un montón de respuestas diferentes (incluidos múltiples duplicados) ya han abordado las siguientes viñetas:

  • Cómo invocar un shell de inicio de sesión o no inicio de sesión
  • Cómo detectar un shell de inicio de sesión o no inicio de sesión
  • Qué archivos de inicio serán consumidos por un shell de inicio de sesión o sin inicio de sesión
  • Consulte la documentación (por ejemplo, man bash) para obtener más detalles.

Lo que las respuestas no dijeron (y también algo sobre lo que todavía estoy confundido) es:

  • ¿Cuál es el caso de uso de un shell de inicio de sesión o sin inicio de sesión ? (por ejemplo, sólo configurados zshrcpara zshy eso es suficiente para la mayoría requisito dev personal, sé que no es tan simple como lo que vimrca vim)

  • ¿Cuál es la razón para usar un inicio de sesión en un shell sin inicio de sesión (además de consumir diferentes archivos de inicio y ciclos de vida)?

Respuestas:


15

La idea es que un usuario debe tener (como máximo) un shell de inicio de sesión por host. (Tal vez debería decir, un shell de inicio de sesión por host por terminal; si inicia sesión simultáneamente en un host a través de múltiples terminales, esperaría tener múltiples shells de inicio de sesión). Este sería típicamente (¿siempre?) El primer shell que obtendrá al iniciar sesión (de ahí el nombre). Por lo tanto, este esquema le permite especificar acciones que desea que sucedan solo una vez por inicio de sesión y cosas que desea que sucedan cada vez que inicia un nuevo shell (interactivo).

Normalmente, cualquier otro shell que ejecute después de iniciar sesión será un descendiente (un hijo de un hijo de un hijo ...) del shell de inicio de sesión y, por lo tanto, heredará muchas configuraciones (variables de entorno umask, etc.) del shell de inicio de sesión. Y, en consecuencia, la idea es que los archivos de entrada de inicialización ( .login, .profile, etc.) deben establecer los ajustes que son heredables, y dejar .bashrc(o cualquier otra cosa que se use) manejar los que no lo son ( set, shopt, las variables de shell no se exportan , etc.)

Otra noción es que los archivos de inicialización de inicio de sesión (y solo ellos) deben hacer "trabajo pesado", es decir, acciones que requieren muchos recursos. Por ejemplo, es posible que desee que ciertos procesos se ejecuten en segundo plano cada vez que inicie sesión (pero solo una copia (instancia) de ellos). Es posible que desee que se muestre cierta información de estado (por ejemplo, dfo who) cuando inicie sesión, pero no cada vez que inicie un nuevo shell interactivo. Especialmente si tienes un interactivoprograma / cuadro de diálogo (es decir, uno que requiere la entrada de usted) que desea ejecutar cada vez que inicia sesión, probablemente no desee que se ejecute cada vez que inicie un nuevo shell. Como ejemplo extremo, hace veinte años, Solaris lo conectó a un único shell no gráfico y sin ventanas. (Creo que ha cambiado desde entonces.) Era el trabajo de .logino .profile(o lo que sea) iniciar el sistema de ventanas, con un comando como startx. (Esto fue útil en parte porque había múltiples sistemas de ventanas disponibles. Diferentes usuarios tenían diferentes preferencias. Algunos usuarios usaron diferentes sistemas en diferentes situaciones, y tuvimos un diálogo en nuestro .profileque preguntaba "¿Qué sistema de ventanas desea usar hoy?") Obviamente, no querrás que se ejecute cada vez que abras una nueva ventana o escribassh.

Han pasado años desde que he usado otra cosa que no sean bash casos extremos. (Por ejemplo, escribo scripts con #!/bin/sh, por lo que en algunos sistemas, mis scripts se ejecutan dashy en otros se ejecutan bashen modo POSIX. Algunas veces al año ejecuto csh/ tcshdurante unos minutos para ver cómo maneja algo, o para responda una pregunta). Si usa múltiples shells (por ejemplo, bashy zsh) diariamente, sus patrones pueden ser diferentes. Si su shell principal (como se define en /etc/passwd) es bash, es posible que desee invocar un zshshell de inicio de sesión y luego quizás invocar algunos zshshells interactivos sin inicio de sesión subordinados a eso. Probablemente debería evitar tener un shell de inicio de sesión que esté subordinado a otro shell de inicio de sesión del mismo tipo.

Como se menciona en la diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión. , la aplicación OS X Terminal ejecuta un shell de inicio de sesión, por lo que un usuario típico generalmente tendrá varios "shells de inicio de sesión" ejecutándose simultáneamente. Este es un modelo un tanto diferente a la que he descrito anteriormente, y puede requerir al usuario volver a pensar lo que hace en su .logino.profile(o lo que sea) archivo. No sé si los desarrolladores de OS X han documentado su justificación para esta decisión de diseño. Pero puedo imaginar una situación en la que esto sería útil. Hubo un momento en que habitualmente abría un puñado de ventanas de shell cuando iniciaba sesión, y las configuraba con diferentes colores de texto y fondo (escribiendo secuencias de escape ANSI en la pantalla) para ayudarme a realizar un seguimiento de cuál era cuál. Los colores terminales son un ejemplo de algo que no es heredado por hijos de hijos, pero que persiste dentro de una ventana. Así que este es el tipo de cosas que desearía hacer cada vez que inicie una nueva ventana de Terminal, pero no cada vez que inicie un nuevo shell interactivo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.