Estaba leyendo la diferencia entre sudo -i/-s aquí . Después de usar el comando shopt, se observa que todos ( sudo su/sudo -i/sudo -s) $SHELLproporcionan los mismos resultados, pero los shoptresultados de los comandos son diferentes.
Entonces, ¿cómo se define de inicio de sesión de inicio de sesión y no la cáscara?
¿De dónde shoptsaca el resultado?
¿Por qué no está relacionado $SHELL?
sudo su
givinv@87-109:~$ sudo su
root@87-109:/home/givinv#
root@87-109:/home/givinv#
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv#
root@87-109:/home/givinv# exit
givinv@87-109:~$
sudo -i
givinv@87-109:~$ sudo -i
root@87-109:~#
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
sudo -s
root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
command-line
bash
sudo
prado
fuente
fuente

.profileo equivalentes), y 2. Es el shell que se supone que debe iniciarse al iniciar sesión para usuario, como se define en/etc/passwdo equivalente.$SHELLcontiene el último, susshoptsalidas tratan con el primero. Típicamente, cuando el shell en (2) se inicia al iniciar sesión, se inicia de la manera específica necesaria para (1), de ahí la combinación de significados.$SHELL(y lo conectaría a un pseudo terminal) que a su vez se define en su entrada / etc / passwd. este shell es un shell de inicio de sesión y se puede probar conif [[ -o login ]]; then echo "I am a login shell"; fi. Al ser un shell de inicio de sesión, realizaría las tareas apropiadas para una nueva sesión. por ejemplo, fuente~/.zprofileo similar que posiblemente establezca variables de entorno y cualquier código de shell personalizado que desee ejecutar en este momentoRespuestas:
TL; DR :
/etc/passwd.sudo su/sudo su -/sudo -i/sudo -siguales? No, todos generan un caparazón pero de manera diferente y en contextos diferentes.$SHELLhacer? Solo dígale a su shell predeterminado, igual que en/etc/passwd.Respuesta real :
En primer lugar, es importante mencionar que
shoptes específico de bash. Por ejemplo, soymkshusuario de shell y no tieneshopt, al igualkshque no.A continuación, ¿qué
login_shellse supone que representa exactamente ? Deman bash:Ese es el punto clave.
sudo -i, como ya sabe por la respuesta anterior que leyó, se supone que simula el inicio de sesión inicial. Es por eso queshoptinformalogin_shell onpara esta opción. Piense en esto como sisudo -iobligara al shell a pasar por los archivos que se supone que deben aparecer solo durante un proceso de inicio de sesión (que no se obtienen mediante shells interactivos).En otros casos, ya está ejecutando una instancia de un shell, por lo que no puede ser un shell de inicio de sesión, y el propósito de las opciones es diferente.
sudo -ssimplemente lee$SHELL(que está destinado a representar su shell predeterminado como se establece/etc/passwd) variable y lo ejecuta con privilegio de root. Esto es equivalente a hacersudo $SHELLosudo mkshosudo bash(lo que sea que uses).¿Recuerdas que mencioné que soy
mkshusuario? Mira esto:Lo que ves es que
sudo -ssaltó debashmimkshshell, con el indicador característico que he establecido para él. Y, por supuesto, dado que no es una acción de inicio de sesión,bashya que informaría que el shell se genera como una instancia de shell sin inicio de sesión. Sin embargo, en mi caso, verá que$-no tiene una letralallí, que estaría allí si se tratara de una instancia de shell de inicio de sesión.Finalmente, la misma idea se aplica a
sudo suysudo su -. Más tarde, uno genera una instancia de shell de inicio de sesión (es decir, se ejecutarán los archivos específicos necesarios para iniciar sesión) y el anterior genera solo shells interactivos (es decir, los archivos de inicio de sesión no se ejecutan).Por lo tanto, técnicamente,
shopt login_shellno tiene relación$SHELLalguna. Piénselo de esta manera: su propósito es mostrar cómo se ejecuta bash.$SHELLse supone que refleja solo lo que has asignado/etc/passwd.En cuanto a la diferencia entre el shell de inicio de sesión y el shell de no inicio de sesión, Gilles lo ha explicado en unix.stackexchange.com en esta respuesta .
Diversión adicional
Aquí hay algo divertido que puedes probar. Como ya sabrás, se ejecutará un shell de inicio de sesión
.profile(y.bashrcdado que Ubuntu.profileestá configurado para hacerlo ), pero el infierno que no inicia sesión solo ejecutará el.bashrcarchivo. Por lo tanto, podemos probar conechocuál de estos comandos ejecuta un shell de inicio de sesión y cuál no, y esperamos dos líneasechopara shell de inicio de sesión y solo una para no inicio de sesión.Apropiadamente, aquellos con dos líneas de salida se habrán
login_shellestablecido enon.fuente
$SHELLylogin_shell/non-login_shellme aclararon. ¿Pero de dóndeshoptobtienen los detalles? Es deecho $0?$0se usa para designar si un shell es o no un shell de inicio de sesión, por lo que sishoptverificaría esa variable, claro, es perfectamente aceptable. Sin embargo, probablemente haya más de lo que parece.shoptprobablemente para esta pregunta, no tengo una respuesta difícil, ya que no estoy familiarizado con el código fuente de bash tan bien.-o utilizando la-lopción.login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.queshopt login_shellparece ser una manera en que bash te permite descubrir, programáticamente, cómo saber cómo se inició. la otra forma sería[[ -o login ]]Como @Serg explica en esta respuesta sobre cómo saber qué shell está ejecutando , la
SHELLvariable es solo el shell predeterminado del usuario actual como se lee en/etc/passwd:así que si
echo $SHELLsiempre volveré/bin/bash:Sea o no la envolvente es una envolvente de inicio de sesión, es un sh ell opt ion determinado a la vez que se inicia la cáscara. El programa shell almacena esta información junto con todas sus otras configuraciones y variables. El
shoptcomando proporciona una manera de ver esta información y, si es posible para la opción en cuestión, establecerla o desactivarla (este no es el caso para ellogin_shellcual, por supuesto, depende del proceso utilizado para iniciar el shell)Las
sudoopciones del programa determinan cómo se iniciarán estos diferentes tipos de shell raíz:fuente
shoptylogin_shellse supone que representan mucho mejor que en mi respuesta.man bash:man login:En breve:
$SHELLes establecida porlogino por el programa de invocación, por ejemplosu. El shell en sí no lo establece.shoptmuestra las opciones de shell actualmente vigentes.fuente