El paso a paso o código que encontrarás en este artículo es la resolución más sencilla y efectiva que encontramos a tu duda o dilema.
Solución:
El único concepto erróneo real que parece tener es sobre lo que constituye un shell de inicio de sesión no interactivo.
Brevemente (ver aquí para más detalles), con ejemplos:
-
shell de inicio de sesión interactivo: Usted inicia sesión en una computadora remota a través de, por ejemplo
ssh
. Alternativamente, puede acceder a un tty en su máquina local (control+alternativa+F1) e inicie sesión allí. -
Shell interactivo sin inicio de sesión: Abra una nueva terminal.
-
shell no interactivo sin inicio de sesión: Ejecute un script. Todos los scripts se ejecutan en su propio subshell y este shell no es interactivo. Solo se abre para ejecutar el script y se cierra inmediatamente una vez que finaliza el script.
-
shell de inicio de sesión no interactivo: Esto es extremadamente raro, y es poco probable que lo encuentres. Una forma de lanzar uno es
echo command | ssh server
. Cuándossh
se inicia sin un comando (por lo quessh
en lugar dessh command
que se ejecutarácommand
en el shell remoto) inicia un shell de inicio de sesión. Si elstdin
de Elssh
no es un tty, inicia un shell no interactivo. Esta es la razón porecho command | ssh server
lanzará un shell de inicio de sesión no interactivo. También puedes empezar uno conbash -l -c command
.
Si quiere jugar con esto, puede probar los distintos tipos de shell de la siguiente manera:
-
¿Este caparazón es interactivo?
Verifique el contenido de la
$-
variable. Para conchas interactivas, incluirái
:## Normal shell, just running a command in a terminal: interacive $ echo $- himBHs ## Non interactive shell $ bash -c 'echo $-' hBc
-
¿Es este un shell de inicio de sesión?
No existe una forma portátil de verificar esto pero, para bash, puede verificar si el
login_shell
se establece la opción:## Normal shell, just running a command in a terminal: interacive $ shopt login_shell login_shell off ## Login shell; $ ssh localhost $ shopt login_shell login_shell on
Poniendo todo esto junto, aquí hay uno de cada tipo posible de caparazón:
## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell off
## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell on
## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell off
## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell on
Esencialmente, si un shell es de inicio de sesión o no, interactivo o no, importa exactamente por una razón:
Los archivos de inicialización y las opciones predeterminadas establecidas dependen de si un shell es de inicio de sesión o no e interactivo o no.
En consecuencia, si un shell es de inicio de sesión o no o interactivo o no depende únicamente de la invocación used – el nombre exacto del comando y las opciones.
Por lo demás, las dos propiedades son ortogonales: si un shell es inicio de sesión o no, no influye en la determinación de si es interactivo o no.
Bash inicia un shell de inicio de sesión si alguno de estos es true:
argv[0]
el nombre del comando como se invocó, comienza con un-
- los
-l
se especifica la opcion
Similar, bash inicia un shell interactivo si alguno de estos es true:
- no se especificó un archivo para ejecutar (es decir, el comando no fue
bash some/file
) o un comando string correr (bash -c 'foo'
) (la condición real es un poco más compleja, consulte el manual) - los
-i
se especificó la opción
Notablemente (y paradójicamente), esto último implica que bash -ic 'foo'
inicia un shell interactivo.
Entonces, lo siguiente inicia un inicio de sesión, shell interactivo, aunque no tiene nada interactivo y la invocación no tiene nada que ver con el inicio de sesión:
bash -lic true
Que el inicio de sesión a través de la consola o la GUI inicie un shell de inicio de sesión (o tal vez no) es completamente un efecto del proceso de inicio de sesión mediante la invocación adecuada.
Las condiciones y efectos se describen en detalle en el manual de bash, sección sobre Archivos de inicio.
Una fuente importante de confusión es que hay otro significado común para el shell de “inicio de sesión”:
El shell de inicio de sesión de un usuario es el shell definido en el passwd
entrada (que puede provenir de /etc/passwd
LDAP o alguna otra fuente).
los login
programa, SSH, etc. inicie este shell como un acceso caparazón en el sentido significado en el resto de la respuesta, con un encabezado -
en el nombre del comando, por lo general. Si quisiera ser particularmente confuso, podría decir:
Algunos procesos de inicio de sesión inician el shell de inicio de sesión del usuario como un shell de inicio de sesión.
Tenga en cuenta que el inicio de sesión de la GUI inicia un shell de inicio de sesión simplemente porque los desarrolladores lo consideraron conveniente: LightDM ejecuta un script al iniciar sesión que obviamente no es interactivo y ciertamente no depende del shell de inicio de sesión del usuario (en el segundo sentido). Sin embargo, no dependa de que el administrador de pantalla inicie un shell de inicio de sesión; no todos lo hacen, y en Wayland y GNOME, el proceso de inicio de sesión no usa scripts de shell en absoluto.
Cáscara de inicio de sesión:
El primer proceso que se ejecuta bajo nuestra ID de usuario cuando iniciamos sesión. 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
Concha interactiva:
Lee comandos de la entrada del usuario en un tty. Entre otras cosas, dicho shell lee los archivos de inicio en la activación, muestra un aviso y habilita el control de trabajos de forma predeterminada. El usuario puede interactuar con el shell. Un shell que ejecuta un script siempre es un shell no interactivo.
En pocas palabras: el shell interactivo requiere la entrada del usuario, mientras que el shell no interactivo se ejecuta mediante scripts y no requiere entradas del usuario.
Sección de Reseñas y Valoraciones
Te invitamos a confirmar nuestra función añadiendo un comentario y puntuándolo te damos las gracias.