A=B\
C
signifie "A est égal à la chaîne B, suivie d'une nouvelle ligne que j'ignore, suivie d'un C".
Il n'y a pas de CR dans ce que vous avez tapé, pour autant que le Shell le voit. La fin de ligne de Linux/Unix est un saut de ligne (LF), pas un CR. Le CR est émis dans le cadre de la gestion du terminal. La plupart des terminaux ont besoin d'un saut de ligne pour sauter une ligne, et d'un retour chariot pour renvoyer le curseur vers la gauche. Le CR est inséré par le noyau, lors de l'envoi d'un Line Feed au terminal, lorsque le terminal en a besoin - c'est-à-dire qu'il n'est pas visible pour le Shell. Notez que, par exemple, un éditeur visuel pourrait séparer l'utilisation du CR et du LF - le moins de caractères vers le prochain morceau d'écran à réécrire peut très bien impliquer un LF (pour aller directement vers le bas de la page sans changer de colonne).
Un peu plus déroutant, il existe également une traduction de l'entrée pour les claviers. La touche Entrée envoie généralement un retour chariot (Control-M). Mais pour reconnaître qu'une commande a été saisie, le Shell doit voir une Fin de ligne. Un élément supplémentaire stty
indique donc au traitement du terminal du noyau qu'une entrée CR doit être traduite en une fin de ligne. Ainsi, le Shell toujours ne voit pas de CR.
Le résultat final est que le terminal envoie :
A=B\<CR>C<CR>
Le Shell reçoit :
A=B\<LF>C<LF>
Le Shell analyse cela comme "oh, backslash newline - je l'ignore" et se retrouve avec :
A=BC<LF>
Et en sortie, le noyau modifie la séquence envoyée au terminal lors de l'entrée de la commande comme :
A=B\<CR><LF>C<CR><LF>
Le traitement par le noyau de la gestion des terminaux est géré par la commande Shell. stty
et en fonction de l'implémentation (Linux, Mac OS X, *BSD), les détails sous-jacents devraient être sous man termios
, man tty_ioctl
. man console_ioctl
etc.