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
) $SHELL
proporcionan los mismos resultados, pero los shopt
resultados 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 shopt
saca 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
.profile
o equivalentes), y 2. Es el shell que se supone que debe iniciarse al iniciar sesión para usuario, como se define en/etc/passwd
o equivalente.$SHELL
contiene el último, susshopt
salidas 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~/.zprofile
o 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 -s
iguales? No, todos generan un caparazón pero de manera diferente y en contextos diferentes.$SHELL
hacer? Solo dígale a su shell predeterminado, igual que en/etc/passwd
.Respuesta real :
En primer lugar, es importante mencionar que
shopt
es específico de bash. Por ejemplo, soymksh
usuario de shell y no tieneshopt
, al igualksh
que no.A continuación, ¿qué
login_shell
se 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 queshopt
informalogin_shell on
para esta opción. Piense en esto como sisudo -i
obligara 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 -s
simplemente 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 $SHELL
osudo mksh
osudo bash
(lo que sea que uses).¿Recuerdas que mencioné que soy
mksh
usuario? Mira esto:Lo que ves es que
sudo -s
saltó debash
mimksh
shell, 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,bash
ya 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 letral
allí, 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 su
ysudo 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_shell
no tiene relación$SHELL
alguna. Piénselo de esta manera: su propósito es mostrar cómo se ejecuta bash.$SHELL
se 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.bashrc
dado que Ubuntu.profile
está configurado para hacerlo ), pero el infierno que no inicia sesión solo ejecutará el.bashrc
archivo. Por lo tanto, podemos probar conecho
cuál de estos comandos ejecuta un shell de inicio de sesión y cuál no, y esperamos dos líneasecho
para 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_shell
establecido enon
.fuente
$SHELL
ylogin_shell/non-login_shell
me aclararon. ¿Pero de dóndeshopt
obtienen los detalles? Es deecho $0
?$0
se usa para designar si un shell es o no un shell de inicio de sesión, por lo que sishopt
verificaría esa variable, claro, es perfectamente aceptable. Sin embargo, probablemente haya más de lo que parece.shopt
probablemente 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-l
opció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_shell
parece 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
SHELL
variable es solo el shell predeterminado del usuario actual como se lee en/etc/passwd
:así que si
echo $SHELL
siempre 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
shopt
comando 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_shell
cual, por supuesto, depende del proceso utilizado para iniciar el shell)Las
sudo
opciones del programa determinan cómo se iniciarán estos diferentes tipos de shell raíz:fuente
shopt
ylogin_shell
se supone que representan mucho mejor que en mi respuesta.man bash
:man login
:En breve:
$SHELL
es establecida porlogin
o por el programa de invocación, por ejemplosu
. El shell en sí no lo establece.shopt
muestra las opciones de shell actualmente vigentes.fuente