TL; DR :
- Où est défini le shell de connexion? Dans
/etc/passwd.
- Sont
sudo su/ sudo su -/ sudo -i/ sudo -sidentiques? Non, ils engendrent tous une coquille mais différemment et dans des contextes différents.
- Que fait
$SHELL-il? Indiquez simplement votre shell par défaut, comme dans /etc/passwd.
Réponse réelle :
Tout d'abord, il est important de mentionner que shoptc'est spécifique à bash. Par exemple, je suis mkshun utilisateur shell, et il n'en a pas shopt, tout comme kshne le fait pas.
Ensuite, qu'est-ce qui login_shellest censé représenter exactement ? De man bash:
login_shell
Le shell définit cette option s'il est démarré en tant que shell de connexion
Voilà le point clé. sudo -i, comme vous le savez déjà dans la réponse précédente que vous lisez, est censé simuler la connexion initiale. C'est pourquoi les shoptrapports login_shell on pour cette option. Considérez ceci comme si sudo -iforce le shell à parcourir les fichiers qui ne devraient apparaître que pendant un processus de connexion (qui ne sont pas fournis par des shells interactifs).
Dans d'autres cas, vous exécutez déjà une instance d'un shell, il ne peut donc pas s'agir d'un shell de connexion en premier lieu, et le but des options est différent. sudo -slit simplement $SHELL(qui est censée représenter votre shell par défaut tel que défini dans /etc/passwd) et l'exécute avec le privilège root. Cela équivaut à faire sudo $SHELLou sudo mkshou sudo bash(selon ce que vous utilisez).
Rappelez-vous que j'ai mentionné que je suis mkshutilisateur? Regarde ça:
$ 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
Ce que vous voyez, c'est que j'ai sudo -ssauté de bashma mkshcoquille, avec l'invite caractéristique que je lui ai définie. Et bien sûr, puisqu'il ne s'agit pas d'une action de connexion, car bashcela signifierait que le shell est généré en tant qu'instance de shell sans connexion. Dans mon cas, cependant, vous voyez qu'il $-n'y a pas de lettre l, qui serait là s'il s'agissait d'une instance de shell de connexion.
Enfin, la même idée s'applique à sudo suet sudo su -. Plus tard, on génère une instance de shell de connexion (c'est-à-dire que les fichiers spécifiques requis pour la connexion s'exécuteront) et l'ancien ne génère que des shells interactifs (c'est-à-dire que les fichiers de connexion ne s'exécutent pas).
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
Donc, techniquement, shopt login_shelln'a aucun rapport avec $SHELLquoi que ce soit. Pensez-y de cette façon: son but est de montrer comment bash fonctionne. $SHELLest censé refléter uniquement ce que vous avez attribué /etc/passwd.
Quant à la différence entre le shell de connexion et le shell sans connexion, elle a été expliquée par Gilles très respecté sur unix.stackexchange.com dans cette réponse .
Amusement supplémentaire
Voici quelque chose d'amusant que vous pouvez essayer. Comme vous le savez peut-être déjà, un shell de connexion s'exécutera .profile(et .bashrcpuisque Ubuntu .profile est configuré pour le faire ), mais l'enfer non-connecté exécutera uniquement un .bashrcfichier. Nous pouvons donc tester avec echolaquelle de ces commandes exécute un shell de connexion et laquelle ne le fait pas, et nous attendons deux lignes de echoshell de connexion et une seule pour les non-login.
$ 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:~#
Assez convenablement, ceux avec deux lignes de sortie se seront login_shellmis à on.
.profileou des équivalents), et 2. C'est le shell qui est censé démarrer à la connexion pour un utilisateur, tel que défini dans/etc/passwdou équivalent.$SHELLcontient le dernier, vosshoptsorties concernent le premier. En règle générale, lorsque le shell dans (2) est démarré à la connexion, il est démarré de la manière spécifique requise pour (1), d'où la fusion des significations.