Quelle est la différence entre ^ C et ^ D pour les terminaux UNIX / Mac OS X?

62

Lorsque j'essaie d'arrêter quelque chose, j'utilise ^Cet parfois ^Den terminal.

Quelle est la différence entre les deux? Pourquoi certains programmes ne répondent pas ^C, mais ^D. Pourquoi Terminal.app se ferme-t-il quand j'utilise ^D?

Prosseek
la source
FYI: Voir les pages Wikipedia pour: le caractère de fin de texte U + 0003 produit par Control + C et le caractère de fin de transmission U + 0004 produit par Control + D.
Basil Bourque

Réponses:

61

CtrlCindique au terminal d'envoyer un message SIGINTau processus de premier plan en cours, ce qui, par défaut, se traduit par la fermeture de l'application. CtrlDindique au terminal qu'il doit enregistrer un EOF sur une entrée standard, ce que bash interprète comme un désir de sortir.

Ignacio Vazquez-Abrams
la source
63

Ctrl+ D( ^D) signifie fin de fichier . Cela ne fonctionne qu'au début d'une ligne (je simplifie un peu), et n'a aucun effet si le programme ne lit pas les entrées du terminal. Dans votre expérience, ^Dvous avez dit au shell que vous n’alliez plus taper de commandes, il s’est arrêté; puis le terminal est sorti parce que son sous-programme était terminé.

Ctrl+ C( ^C) signifie “interrompre”, c.-à-d. arrêtez ce que vous faites. Techniquement, appuyer sur ^Cenvoie le signal INT qui, par défaut, met fin à une application, mais qui, dans de nombreux programmes, signifie revenir au niveau supérieur (par exemple, dans un shell, arrêtez de taper une ligne de commande et revenez à une invite vierge).

Si un programme ne répond pas ^C, vous pouvez essayer Ctrl+ \( ^\). Cela envoie le signal QUIT qui, par défaut, met fin à une application et que peu de programmes interceptent.

Une autre touche qui envoie un signal est Ctrl+ Z( ^Z). Il envoie le signal TSTP , ce qui met en pause le programme exécuté au premier plan. (TSTP est l'abréviation de “terminal stop”; il est similaire à STOP mais TSTP peut être ignoré alors que STOP ne le peut pas.) À partir du shell, vous pouvez reprendre l'exécution de ce programme avec la fgcommande (resume au premier plan) ou la bgcommande (resume au début). Contexte).

Toutes ces clés peuvent être changées avec la sttycommande. Certains programmes, notamment les programmes plein écran dotés de raccourcis clavier, les désactivent.

Gilles, arrête de faire le mal
la source
Une petite correction: Control-Z envoie le signal TSTP (terminal stop). Cela peut être capturé ou ignoré par les processus, alors que le signal STOP ne peut pas l'être.
Chris Page
J'avais besoin de ça! elle était bloquée et je ne pouvais pas sortir
ahnbizcad
1
Juste une suggestion concernant CTRL-D: cela signifie "vider l'entrée que j'ai tapée jusqu'à présent" et si la ligne est vide, alors read () retourne à zéro et est interprété comme "fin de fichier".
luca
C'est une information super importante et utile; merci pour l'explication complète et claire
iono
Juste pour être curieux, pourquoi le programme python qui s’exécute en shell n’arrête-t-il pas avec ctrl + c, mais est-il invité KeyboardInterrupt? Il se ferme avec ctrl + d (si au début d'une ligne), et avec ctrl + \.
Rick
2

Ajoutant aux 2 très bonnes réponses ci-dessus, voici un exemple:

Si vous tapez pythondans le shell, cela vous mènera à l'invite >>> de python.

Maintenant, si vous frappez Ctrl+C, il dira KeyboardInterruptet restera dans le >>>.
Si vous entrez dans une boucle for, par exemple en le saisissant for x in (text):, attend de taper plus en affichant une invite ..., si vous appuyez Ctrl+Cmaintenant, il sortira de l'instruction for et retournera à l'invite >>>
Si vous appuyez sur Ctrl+Dà tout moment, que ce soit dans >>> ou ..., il sortira de l'invite de python et retournera au shell d'origine.

De même, si ssh'ed sur une autre machine, a Ctrl+Cmettra fin à toute commande existante, le Ctrl+Dfera et sortira également de la machine. (En outre, la Deleteclé est la même chose que faire a Ctrl+D)

Siddhartha
la source
J'apprécie cette réponse. Cependant, j'ai trouvé des inexactitudes en essayant moi-même. Tandis que ssh'ed dans une machine distante et exécutant le processus python, Ctrl + D a quitté python et m'a ramené à l'invite de la machine distante, elle n'est pas sortie de la machine. En outre, la touche Suppr ne fonctionnait pas de la même manière que Ctrl + D, que ce soit avec Python, à l’invite à distance ou à l’invite locale. Il ne semblait rien faire, sauf bien sûr supprimer des caractères lors de la frappe en python. Cependant, Ctrl + D agissait comme la touche Suppr lors de la frappe, elle supprimait des caractères.
Stack Underflow
1
C'est intéressant, je pense que cela dépend du type de shell que vous utilisez (bash, ksh, etc.).
Siddhartha