web-dev-qa-db-fra.com

Comment signaler la fin de l'entrée stdin

  1. Dans Bash, j'ai appris que le signal de fin peut être modifié par ce document. Mais par défaut, comment puis-je signaler la fin de l'entrée stdin?
  2. Il m'est arrivé de constater qu'avec cat et chardet, leurs entrées stdin peuvent être signalées comme terminées par Ctrl + d. Mais je semble me souvenir que Ctrl + d et Ctrl + c sont similaires à la fin de l'exécution d'une commande en cours d'exécution. Alors je me trompe?
84
Tim

Ctrl+D, lorsqu'il est tapé au début d'une ligne sur un terminal, signifie la fin de l'entrée. Ce n'est pas un signal au sens unix: lorsqu'une application lit à partir du terminal et que l'utilisateur appuie sur Ctrl+D, l'application est notifiée que la fin du fichier a été atteinte (comme si elle lisait un fichier et avait passé le dernier octet).

Ctrl+C envoie un signal, SIGINT . Par défaut, SIGINT (le signal d'interruption) tue l'application de premier plan, mais l'application peut intercepter le signal et réagir d'une manière différente (par exemple, le shell lui-même capte le signal et abandonne la ligne que vous avez commencé à taper, mais il ne le fait pas '' t quitter, il affiche une nouvelle invite et attend une nouvelle ligne de commande).

Vous pouvez modifier les caractères associés à la fin du fichier et SIGINT avec la commande stty , par ex. stty eof a ferait de a le caractère de fin de fichier et stty intr ^- désactiverait le caractère SIGINT. C'est rarement utile.

Votre deuxième point regroupe deux choses complètement différentes ensemble.

  • Ctrl + C envoie un signal d'arrêt au processus en cours.
  • Ctrl + D envoie un caractère Fin de transmission .

Vous recherchez ce dernier.

23
Caleb