TL; DR :
- ¿Dónde se define el shell de inicio de sesión? En
/etc/passwd.
- ¿Son
sudo su/ sudo su -/ sudo -i/ sudo -siguales? No, todos generan un caparazón pero de manera diferente y en contextos diferentes.
- ¿Qué
$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, soy mkshusuario de shell y no tiene shopt, al igual kshque no.
A continuación, ¿qué login_shellse supone que representa exactamente ? De man bash:
login_shell
El shell establece esta opción si se inicia como un shell de inicio de sesión
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 que shoptinforma login_shell on para esta opción. Piense en esto como si sudo -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 hacer sudo $SHELLo sudo mksho sudo bash(lo que sea que uses).
¿Recuerdas que mencioné que soy mkshusuario? Mira esto:
$ bash --posix
bash-4.3$ sudo -s
[sudo] password for xieerqi:
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id
uid=0(root) gid=0(root) groups=0(root)
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU
Lo que ves es que sudo -ssaltó de bashmi mkshshell, 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 letra lallí, 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 suy sudo 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).
bash-4.3$ sudo su
[sudo] password for xieerqi:
root@eagle:/home/xieerqi# shopt login_shell
login_shell off
root@eagle:/home/xieerqi# exit
bash-4.3$ sudo su -
[sudo] password for xieerqi:
$ shopt login_shell
login_shell on
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 .profile está configurado para hacerlo ), pero el infierno que no inicia sesión solo ejecutará el .bashrcarchivo. Por lo tanto, podemos probar con echocuál de estos comandos ejecuta un shell de inicio de sesión y cuál no, y esperamos dos líneas echopara shell de inicio de sesión y solo una para no inicio de sesión.
$ echo "echo 'hi,i am .profile'" >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ sudo -i
hi, i am .bashrc
hi,i am .profile
$ sudo su
hi, i am .bashrc
root@eagle:~# sudo su -
hi, i am .bashrc
hi,i am .profile
$ sudo -s
hi, i am .bashrc
root@eagle:~#
Apropiadamente, aquellos con dos líneas de salida se habrán login_shellestablecido en on.
.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.