C'est ce qui s'est passé lorsque j'ai exécuté sudo su
suivi deexit
$ sudo su
# exit
exit
$
La commande exit ne ferme pas mon émulateur de terminal.
Est-ce un terminal enfant?
C'est ce qui s'est passé lorsque j'ai exécuté sudo su
suivi deexit
$ sudo su
# exit
exit
$
La commande exit ne ferme pas mon émulateur de terminal.
Est-ce un terminal enfant?
Réponses:
Une fois que vous avez exécuté sudo su
ou qu'un nouveau shell est en cours de création.su user
L'exécution exit
(ou Ctrl+ D) quittera le shell nouvellement créé et vous ramènera à votre shell précédent.
Point de départ - le shell bash s'exécute sur le PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25200 pts/17 00:00:00 ps
L'exécution sudo su
crée un nouveau processus bash qui s'exécute sur le 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
Quitter sudo su
et revenir au point de départ - le shell bash s'exécute sur le PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25214 pts/17 00:00:00 ps
$
Les processus enfants que vous exécutez à partir d'un shell, y compris les shells enfants, utilisent automatiquement le même terminal. Ce n'est pas spécifique à sudo
en aucune façon - c'est généralement comment cela fonctionne lorsque vous exécutez un programme à partir de votre shell.
Les coques et les terminaux sont des choses différentes. Un shell est ce que vous utilisez pour exécuter des commandes dans un terminal . Un shell peut fonctionner de manière interactive - il vous donne une invite, vous lui donnez une commande, il exécute la commande ou affiche une erreur expliquant pourquoi il ne peut pas, et le processus se répète jusqu'à ce que vous quittiez le shell. Ou il peut fonctionner de manière non interactive, en exécutant un script .
Même si votre terminal est (probablement!) Émulé , pas physique , néanmoins des systèmes d'exploitation de type Unix comme Ubuntu attribuent des nœuds de périphérique à chacun de vos terminaux, et vous pouvez vérifier quel terminal vous utilisez avec la tty
commande. Il sera généralement /dev/pts/0
, /dev/pts/1
, /dev/pts/2
, etc. , pour une fenêtre de terminal ou connexion SSH , ou /dev/tty1
, /dev/tty2
, etc. , pour les consoles virtuelles . En réalité, ce tty
qui est fait, c'est de vous dire à partir de quel terminal, le cas échéant, l' entrée est prise; voir ci-dessous pour plus de détails.
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:~$
Vous pouvez voir que, même s'il sudo su
crée un nouveau shell comme l'explique très bien Yaron , le terminal que vous utilisez ne change pas.
Bien sûr, il existe une autre façon de constater que le terminal est le même: vous écrivez toujours l'entrée de la même manière et au même endroit, et la lecture de la sortie de la même manière et au même endroit.
La plupart des commandes dans un shell - comme ls
, cp
, mv
, rm
, touch
, wc
, du
, df
, ssh
, su
, sudo
, sh
, bash
et beaucoup plus - provoquer un processus enfant à créer. Ce processus enfant a votre shell comme parent mais il s'agit d'un programme distinct. Par défaut, il est connecté au même terminal que votre shell.
Votre shell est toujours en cours d'exécution, mais il attend en arrière-plan que le programme se termine (ou que vous le suspendiez ). À la fin du programme, le shell est toujours en cours d'exécution et reprend son fonctionnement, vous invitant à entrer votre prochaine commande.
Ce sont les principales exceptions:
cd
ne créent pas du tout de nouveau processus, à moins qu'elles ne soient utilisées dans une construction qui utilise une sous - coquille ( expliquée ici ), comme le (
)
regroupement et les pipelines .&
. ( your-command arguments... &
)disown
intégrée , vous pouvez détacher des tâches de votre terminal.Bien que je ne considère pas vraiment cela comme une exception aux processus enfants connectés au même terminal que leur parent, notez qu'un processus que vous exécutez à partir d'un shell dans un terminal ne prendra pas toujours l'entrée de ce terminal ou n'en enverra pas de sortie à ce terminal. :
<
, >
et les >>
opérateurs.|
.Comme la tty
commande ne vérifie que le terminal de son entrée standard, vous pouvez le "tromper":
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0
Ou, moins sournoisement:
ek@Io:~$ tty </dev/null # not a terminal
not a tty
ek@Io:~$ tty <&- # closes the input stream
not a tty