TL; DR :
- Wo ist die Login-Shell definiert? In
/etc/passwd.
- Sind
sudo su/ sudo su -/ sudo -i/ sudo -sgleich? Nein, sie alle spawnen eine Shell, aber anders und in unterschiedlichen Kontexten.
- Was macht
$SHELLdas? Sagen Sie einfach Ihre Standard-Shell, wie in /etc/passwd.
Tatsächliche Antwort :
Zuallererst ist es wichtig zu erwähnen, dass dies shoptbash-spezifisch ist. Zum Beispiel bin ich mkshShell-Benutzer, und es hat nicht shopt, genau wie kshnicht.
Was genau login_shellsoll als nächstes dargestellt werden? Von man bash:
login_shell
Die Shell setzt diese Option, wenn sie als Login-Shell gestartet wird
Das ist der entscheidende Punkt. sudo -isoll, wie Sie bereits aus der vorherigen Antwort wissen, die erstmalige Anmeldung simulieren. Aus diesem Grund shoptwird login_shell on für diese Option berichtet. Stellen Sie sich das so vor, als würde sudo -idie Shell dazu gezwungen, Dateien zu durchsuchen, die nur während eines Anmeldevorgangs angezeigt werden sollen (die nicht von interaktiven Shells bezogen werden).
In anderen Fällen führen Sie bereits eine Instanz einer Shell aus, sodass es sich nicht in erster Linie um eine Anmeldeshell handeln kann, und der Zweck der Optionen ist unterschiedlich. sudo -sLiest lediglich $SHELLdie /etc/passwdVariable (die Ihre Standard-Shell darstellen soll, wie sie in festgelegt ist ) und führt sie mit Root-Rechten aus. Dies entspricht tun sudo $SHELLoder sudo mkshoder sudo bash(je nachdem , was Sie verwenden passieren).
Erinnerst mkshdu dich, dass ich erwähnt habe, dass ich ein Benutzer bin ? Schau dir das an:
$ 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
Was Sie sehen, ist, dass es in meine Muschel sudo -sgesprungen ist , mit der charakteristischen Eingabeaufforderung, die ich dafür festgelegt habe. Und da es sich natürlich nicht um eine Anmeldeaktion handelt, wird gemeldet, dass die Shell als Nicht-Anmeldeshellinstanz erstellt wurde. In meinem Fall sehen Sie jedoch, dass dort kein Buchstabe vorhanden ist, der vorhanden wäre, wenn dies eine Login-Shell-Instanz wäre.bashmkshbash$-l
Letztendlich gilt der gleiche Gedanke für sudo suund sudo su -. Später wird eine Login-Shell-Instanz erzeugt (dh, bestimmte Dateien, die für die Anmeldung erforderlich sind, werden ausgeführt), und erstere erzeugt nur interaktive Shells (dh, Anmeldedateien werden nicht ausgeführt).
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
Also technisch shopt login_shellhat das überhaupt nichts zu $SHELLtun. Stellen Sie es sich so vor: Es soll zeigen, wie bash ausgeführt wird. $SHELLsoll nur widerspiegeln, was Sie in zugewiesen haben /etc/passwd.
Der Unterschied zwischen Anmelde-Shell und Nicht-Anmelde-Shell wurde in dieser Antwort von hoch angesehenem Gilles auf unix.stackexchange.com erklärt .
Zusätzlicher Spaß
Hier ist etwas Spaß, den Sie ausprobieren können. Wie Sie vielleicht bereits wissen, wird eine Login-Shell ausgeführt.profile (und .bashrcda Ubuntu .profile dafür konfiguriert ist ), aber Nicht-Logins werden nur .bashrcDateien ausgeführt. Wir können also testen, mit echowelchem dieser Befehle eine Login-Shell ausgeführt wird und mit welchem nicht. Wir erwarten zwei Zeilen echofür die Login-Shell und nur eine für die Nicht-Login-Shell.
$ 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:~#
Passenderweise haben diejenigen mit zwei Ausgabezeilen auf login_shellgesetzt on.
.profileoder Äquivalente) Benutzer, wie in/etc/passwdoder gleichwertig definiert .$SHELLEnthält die letztere, beschäftigen sich IhreshoptAusgaben mit der ersteren. Wenn die Shell in (2) bei der Anmeldung gestartet wird, wird sie in der Regel auf die für (1) erforderliche Art und Weise gestartet, sodass die Bedeutungen zusammengeführt werden.