Comment et pourquoi «exec false» ferme-t-il le terminal?

8

Je sais que c'est probablement une question relativement inutile, mais je suis curieux de savoir pourquoi exec falseferme le terminal comme il le exitfait.

Je voudrais également savoir si c'est une façon acceptable de fermer le terminal ou non.

dragonloverlord
la source
Lecture également pertinente: Quelle est la différence entre eval et exec?
Sergiy Kolodyazhnyy

Réponses:

10

exec falseremplace le shell actuel par l'exécution de la commande false(ici pas le shell intégré mais /bin/falseou tout autre falseexécutable qui arrive en premier dans le PATH) qui se termine rapidement. Si le shell était le processus le plus élevé en cours d'exécution dans votre émulateur de terminal, il n'y a plus de processus en cours d'exécution à l'intérieur, l'émulateur de terminal est donc fermé.

Il s'agit d'une autre manière acceptable de fermer un terminal, tout comme le seraient de nombreuses commandes similaires:

exec true
exec sleep 0
exec echo
...

Voir aussi: what-does-an-exec-command-do

jlliagre
la source
En remarque, basheffectuera un certain nettoyage avant d'appeler, execy compris l'écriture de commandes dans .bash_history. Donc, si l'on veut simplement enregistrer .bash_historyet lancer un nouveau shell dans la même fenêtre de terminal, on peut le faire en tapant exec bash.
kasperd
Ok merci vous avez parfaitement répondu à ma question :)
dragonloverlord
Et une bonne question! donc voté à la fois! ;)
Fabby
@jiliagre execappelle des commandes trouvées dans PATH, pas des commandes intégrées. Par exemple, exec [[ $USER = root ]]retournera une bash: exec: [[: not founderreur. Dans le cas d'OP, falsecela s'appelle is /bin/false, et non le shell intégré. Sinon, bonne réponse, donc +1. En guise de remarque, execpeut être une sorte de commande de coupure, c'est-à-dire si ces trois commandes dans votre exemple ont été transformées en script, rien au-delà execne serait atteint, car execremplacerait le shell appelé par script par la commande à droite de exec.
Sergiy Kolodyazhnyy