Comment signaler la fin de l'entrée stdin

82
  1. Dans Bash, j'ai appris que le signal final peut être changé par le document ici. 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. Alors je me trompe?
Tim
la source

Réponses:

114

Ctrl+D, lorsque vous tapez 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 depuis le terminal et que l'utilisateur appuie Ctrl+D, l'application est avertie que la fin du fichier a été atteinte (comme si elle lisait dans un fichier et avait passé le dernier octet).

Ctrl+Cenvoie un signal, SIGINT . Par défaut, SIGINT (le signal d'interruption) tue l'application de premier plan, mais l'application peut capter le signal et réagir différemment (par exemple, le shell lui-même intercepte le signal et interrompt la ligne que vous avez commencé à taper, mais il ne fonctionne pas. t exit, il affiche une nouvelle invite et attend une nouvelle ligne de commande).

Vous pouvez modifier les caractères associés à la fin de fichier et à SIGINT à l'aide de la sttycommande, par exemple stty eof acréer ale caractère de fin de fichier et stty intr ^-désactiver le caractère SIGINT. Ceci est rarement utile.

Gilles
la source
Merci! Est Ctrl+D- ce que ça veut dire Ctrl et D majuscule ou ça n'a pas d'importance?
Tim
5
@Tim: vous voulez des minuscules ... la convention d'écriture des commandes du clavier avec des majuscules vient du fait que les étiquettes sur le clavier sont toujours en majuscules et que la chose décrite est une séquence de touches et non le code de caractère réel vu par le programme. Oui, c'est parfois déroutant.
Caleb
@Caleb: Merci! Comment spécifier que la clé est en capital? Ou y a-t-il jamais un tel cas?
Tim
@Tim Sur un terminal, les combinaisons de touches Ctrl+Shift+Det Ctrl+Denvoient quand même le même caractère (numéro 4, généralement appelé Ctrl+D).
Gilles
2
@Tim Le terminal a reçu Ctrl + D. Il n'envoie pas de personnage au programme. Ce qui se passe, c'est que lorsque le programme lit à partir du terminal, le terminal lui dit «c'est la fin du fichier», comme lorsqu'un programme essaie de lire après la fin d'un fichier sur disque. Le shell n'est pas impliqué du tout.
Gilles
23

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

  • Ctrl + C envoie un signal de suppression au processus en cours d'exécution.
  • Ctrl + D envoie un caractère de fin de transmission .

Vous recherchez ce dernier.

Caleb
la source
7
Risque de confusion ici: du point de vue de l'application, aucun caractère réel n'est envoyé pour ^ D. Ce qui signifie que l'application ne read(2)reçoit pas ce caractère de l' appel système.
Ulidtko