Dies ist, was passiert ist, als ich ausgeführt habe, sudo su
gefolgt vonexit
$ sudo su
# exit
exit
$
Der Befehl exit schließt meinen Terminalemulator nicht.
Ist es ein Kinderterminal?
Dies ist, was passiert ist, als ich ausgeführt habe, sudo su
gefolgt vonexit
$ sudo su
# exit
exit
$
Der Befehl exit schließt meinen Terminalemulator nicht.
Ist es ein Kinderterminal?
Antworten:
Sobald Sie ausführen sudo su
oder eine neue Shell erstellt wird.su user
Durch Ausführen exit
(oder Ctrl+ D) wird die neu erstellte Shell beendet und Sie kehren zu Ihrer vorherigen Shell zurück.
Startpunkt - Bash Shell läuft auf PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25200 pts/17 00:00:00 ps
Durch Ausführen sudo su
wird ein neuer Bash-Prozess erstellt, der unter PID 25203 ausgeführt wird:
$ sudo su
# ps
PID TTY TIME CMD
25201 pts/17 00:00:00 sudo
25202 pts/17 00:00:00 su
25203 pts/17 00:00:00 bash
25213 pts/17 00:00:00 ps
# exit
Beenden sudo su
und Zurückkehren zum Startpunkt - Die Bash-Shell läuft unter PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25214 pts/17 00:00:00 ps
$
Untergeordnete Prozesse, die Sie von einer Shell aus ausführen, einschließlich untergeordneter Shells, verwenden dasselbe Terminal automatisch. Dies ist sudo
in keiner Weise spezifisch - so funktioniert es im Allgemeinen, wenn Sie ein Programm von Ihrer Shell aus ausführen.
Muscheln und Terminals sind verschiedene Dinge. Mit einer Shell können Sie Befehle in einem Terminal ausführen . Eine Shell kann interaktiv arbeiten - sie gibt Ihnen eine Eingabeaufforderung, Sie geben ihr einen Befehl, sie führt den Befehl aus oder zeigt einen Fehler an, warum dies nicht möglich ist, und der Vorgang wird wiederholt, bis Sie die Shell beenden. Oder es kann nicht interaktiv arbeiten und ein Skript ausführen .
Auch wenn Ihr Terminal (wahrscheinlich!) Emuliert , nicht körperliche , dennoch Unix-ähnlichen Systemen wie Ubuntu assign Betriebsgeräteknoten zu jedem Ihrer Terminals, und Sie können überprüfen , was Terminal Sie mit dem verwendeten tty
Befehl. Es wird in der Regel /dev/pts/0
, /dev/pts/1
, /dev/pts/2
, usw. , für ein Terminal - Fenster oder SSH - Verbindung , oder /dev/tty1
, /dev/tty2
, usw. , für virtuelle Konsolen . Was tty
Sie wirklich tun müssen, ist Ihnen zu sagen, von welchem Terminal, falls vorhanden, Eingaben stammen. siehe unten für Details.
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ bash
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ exit
exit
ek@Io:~$ sudo su
[sudo] password for ek:
root@Io:/home/ek# tty
/dev/pts/1
root@Io:/home/ek# exit
exit
ek@Io:~$
Sie können sehen, dass sich das von Ihnen verwendete Terminal nicht ändert , obwohl sudo su
eine neue Shell erstellt wird, wie Yaron sehr gut erklärt .
Natürlich gibt es eine andere Möglichkeit, um festzustellen, dass das Terminal dasselbe ist: Sie schreiben die Eingabe immer noch auf dieselbe Weise und an derselben Stelle und lesen die Ausgabe auf dieselbe Weise und an derselben Stelle.
Die meisten Befehle ausführen Sie in einem Shell - wie ls
, cp
, mv
, rm
, touch
, wc
, du
, df
, ssh
, su
, sudo
, sh
, bash
, und viele mehr - bewirken , dass ein Kind - Prozess erstellt werden. Dieser untergeordnete Prozess hat Ihre Shell als übergeordnetes Element, ist jedoch ein separates Programm. Standardmäßig ist es mit demselben Terminal wie Ihre Shell verbunden.
Ihre Shell wird noch ausgeführt, wartet jedoch im Hintergrund darauf, dass das Programm beendet wird (oder dass Sie es anhalten ). Wenn das Programm beendet wird, wird die Shell weiterhin ausgeführt und der Betrieb wieder aufgenommen, sodass Sie zur Eingabe Ihres nächsten Befehls aufgefordert werden.
Dies sind die Hauptausnahmen:
cd
erstellen keinen neuen Prozess, es sei denn, sie werden in einem Konstrukt verwendet, das eine ( hier erläuterte ) Subshell verwendet , z. B. Gruppierung und Pipelines .(
)
&
. ( your-command arguments... &
)disown
Funktion können Sie Jobs von Ihrem Terminal trennen .Obwohl ich dies nicht wirklich als Ausnahme für untergeordnete Prozesse betrachten würde, die mit demselben Terminal wie das übergeordnete verbunden sind, beachten Sie, dass ein Prozess, den Sie von einer Shell in einem Terminal ausführen, nicht immer Eingaben von diesem Terminal entgegennimmt oder Ausgaben an dieses Terminal sendet ::
<
, >
und >>
Betreibern.|
.Da der tty
Befehl nur prüft, welches Terminal seine Standardeingabe ist, können Sie ihn "täuschen":
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0
Oder weniger verschlagen:
ek@Io:~$ tty </dev/null # not a terminal
not a tty
ek@Io:~$ tty <&- # closes the input stream
not a tty