TL; DR :
- Onde o shell de login está definido? In
/etc/passwd.
- São
sudo su/ sudo su -/ sudo -i/ sudo -siguais? Não, todos eles geram uma concha, mas de maneira diferente e em contextos diferentes.
- O que
$SHELLfaz? Apenas diga ao seu shell padrão, o mesmo que em /etc/passwd.
Resposta real :
Antes de tudo, é importante mencionar que shopt é específico do bash. Por exemplo, eu sou mkshusuário de shell, e ele não tem shopt, assim como kshnão.
Em seguida, o que exatamente login_shelldeve representar? De man bash:
login_shell
O shell define esta opção se for iniciado como um shell de login
Esse é o ponto chave. sudo -i, como você já sabe da resposta anterior que leu, deve simular o login inicial. É por isso que os shoptrelatórios login_shell on para esta opção. Pense nisso como se sudo -iobriga o shell a passar por arquivos que deveriam aparecer apenas durante um processo de login (que não são originados por shells interativos).
Em outros casos, você já está executando uma instância de um shell, portanto, não pode ser o shell de login em primeiro lugar, e o objetivo das opções é diferente. sudo -sapenas lê $SHELL(que deve representar seu shell padrão como definido /etc/passwd) e a executa com privilégios de root. Isso é equivalente a fazer sudo $SHELLou sudo mkshou sudo bash(o que você usar).
Lembre-se de que eu mencionei que sou mksh usuário? Dê uma olhada neste:
$ 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
O que você vê é que sudo -spulou bashpara o meu mkshshell, com o prompt característico que defini para ele. E, é claro, como não é uma ação de login, bashele reportaria que o shell foi gerado como uma instância do shell que não é de login. No meu caso, no entanto, você vê que$- não tem uma carta llá, que estaria lá se essa fosse uma instância do shell de logon.
Finalmente, a mesma idéia se aplica a sudo sue sudo su -. Posteriormente, uma gera a instância do shell de login (ou seja, os arquivos específicos necessários para o login serão executados) e a primeira gera apenas shells interativos (ou seja, os arquivos de login não são executados).
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
Então, tecnicamente, shopt login_shellnão tem relação $SHELLalguma. Pense desta maneira: seu objetivo é mostrar como bash é executado. $SHELLdeve refletir apenas o que você atribuiu /etc/passwd.
Quanto à diferença entre o shell de login e o shell que não é de login, foi explicado pelo respeitado Gilles em unix.stackexchange.com nesta resposta .
Diversão adicional
Aqui está algo divertido que você pode tentar. Como você já deve saber, um shell de login será executado .profile(e, .bashrccomo o Ubuntu .profile está configurado para fazê-lo ), mas o não-logon será o único .bashrcarquivo em execução . Portanto, podemos testar com echoqual desses comandos executa um shell de logon e qual não, e esperamos duas linhas echopara o shell de logon e apenas uma para o não logon.
$ 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:~#
Apropriadamente, aqueles com duas linhas de saída terão login_shelldefinido como on.
.profileou equivalentes) e 2. É o shell que deveria ser iniciado no login para um usuário, conforme definido/etc/passwdou equivalente.$SHELLcontém o último, suasshoptsaídas lidam com o primeiro. Normalmente, quando o shell em (2) é iniciado no login, ele é iniciado da maneira específica necessária para (1), daí a fusão de significados.