Questo è quello che è successo quando ho eseguito sudo su
seguito daexit
$ sudo su
# exit
exit
$
Il comando exit non chiude il mio emulatore di terminale.
È un terminale per bambini?
Questo è quello che è successo quando ho eseguito sudo su
seguito daexit
$ sudo su
# exit
exit
$
Il comando exit non chiude il mio emulatore di terminale.
È un terminale per bambini?
Risposte:
Una volta eseguito sudo su
o viene creata una nuova shell.su user
L'esecuzione exit
(o Ctrl+ D) uscirà dalla shell appena creata e tornerà alla shell precedente.
Punto di partenza: la shell bash è in esecuzione su PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25200 pts/17 00:00:00 ps
In esecuzione sudo su
crea un nuovo processo bash in esecuzione su PID 25203:
$ 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
Uscita sudo su
e ritorno al punto iniziale - la shell bash è in esecuzione su PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25214 pts/17 00:00:00 ps
$
I processi figlio eseguiti da una shell, incluse le shell secondarie, utilizzano automaticamente lo stesso terminale. Questo non è specifico sudo
in alcun modo - questo è generalmente il modo in cui funziona quando si esegue qualsiasi programma dalla shell.
Conchiglie e terminali sono cose diverse. Una shell è ciò che usi per eseguire comandi in un terminale . Una shell può operare in modo interattivo: ti dà un prompt, gli dai un comando, esegue il comando o mostra un errore sul perché non è possibile e il processo si ripete fino a quando non esci dalla shell. Oppure può funzionare in modo non interattivo, eseguendo uno script .
Anche se il tuo terminale è (probabilmente!) Emulato , non fisico , tuttavia i sistemi operativi simili a Unix come Ubuntu assegnano nodi di dispositivo a ciascuno dei tuoi terminali e puoi controllare quale terminale stai usando con il tty
comando. Sarà di solito /dev/pts/0
, /dev/pts/1
, /dev/pts/2
, ecc , per una finestra di terminale o connessione SSH , o /dev/tty1
, /dev/tty2
, ecc , per console virtuali . Davvero ciò che tty
fa è dirti da quale terminale, se presente, viene ricevuto l' input ; vedi sotto per i dettagli.
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:~$
Puoi vedere che, anche se sudo su
crea una nuova shell come spiega molto bene Yaron , il terminale che stai usando non cambia.
Naturalmente, c'è un altro modo per osservare che il terminale è lo stesso: stai ancora scrivendo input nello stesso modo e nello stesso posto, e leggendo l'output nello stesso modo e nello stesso posto.
La maggior parte dei comandi eseguiti in una shell - come ad esempio ls
, cp
, mv
, rm
, touch
, wc
, du
, df
, ssh
, su
, sudo
, sh
, bash
, e molti di più - causa un processo figlio da creare. Questo processo figlio ha la shell come padre ma è un programma separato. Per default, è collegato al medesimo terminale come shell.
La shell è ancora in esecuzione, ma attende in background il termine del programma (o la sospensione da parte dell'utente ). Al termine del programma, la shell è ancora in esecuzione e riprende a funzionare, richiedendo il comando successivo.
Queste sono le principali eccezioni:
cd
non creano affatto un nuovo processo, a meno che non vengano utilizzati in un costrutto che impiega una subshell ( spiegata qui ), come il (
)
raggruppamento e le pipeline .&
. ( your-command arguments... &
)disown
integrata , puoi staccare i lavori dal tuo terminale.Anche se non considererei davvero questa un'eccezione ai processi figlio connessi allo stesso terminale del loro genitore, nota che un processo che esegui da una shell in un terminale non prenderà sempre input da quel terminale o invierà output a quel terminale :
<
, >
e >>
gli operatori.|
.Poiché il tty
comando controlla solo quale terminale è il suo input standard, puoi "ingannarlo":
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0
O, meno subdolo:
ek@Io:~$ tty </dev/null # not a terminal
not a tty
ek@Io:~$ tty <&- # closes the input stream
not a tty