Unix / Linux EOL est LF, saut de ligne, ASCII 10, séquence d'échappement \n
.
Voici un extrait de code Python pour obtenir exactement une pression de touche:
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
Lorsque j'appuie Entersur mon clavier en réponse à cet extrait, il donne \r
, retour chariot, ASCII 13.
Sous Windows , Enterenvoie CR LF == 13 10
. * nix n'est pas Windows; pourquoi Enterdonne 13 plutôt que 10?
Réponses:
Bien que la réponse de Thomas Dickey soit tout à fait correcte, Stéphane Chazelas a correctement mentionné dans un commentaire à la réponse de Dickey que la conversion n'est pas figée; cela fait partie de la discipline de ligne.
En fait, la traduction est entièrement programmable.
La page de manuel man 3 termios contient essentiellement toutes les informations pertinentes. (Le lien mène au projet de pages de manuel Linux , qui mentionne les fonctionnalités qui sont uniquement Linux et celles qui sont communes à POSIX ou à d'autres systèmes; vérifiez toujours la section Conformité à sur chaque page.)
Les
iflag
attributs de terminal (old_settings[0]
dans le code montré dans la question en Python ) ont trois drapeaux pertinents sur tous les systèmes POSIXy:INLCR
: Si défini, traduire NL en CR en entréeICRNL
: Si défini (etIGNCR
n'est pas défini), traduire CR en NL en entréeIGNCR
: Ignorer CR sur l'entréeDe même, il existe également des paramètres de sortie associés (
old_settings[1]
):OPOST
: Activer le traitement de sortie.OCRNL
: Mappez CR à NL en sortie.ONLCR
: Mappez NL sur CR en sortie. (XSI; non disponible sur tous les systèmes POSIX ou Single-Unix-Specification.)ONOCR
: Ignorer (ne pas sortir) CR dans la première colonne.ONLRET
: Ignorer (ne pas sortir) CR.Par exemple, vous pourriez éviter de vous fier au
tty
module. L'opération "makeraw" efface simplement un ensemble d'indicateurs (et définit l'CS8
oflag):bien que pour des raisons de compatibilité, vous souhaiterez peut-être vérifier si toutes ces constantes existent d'abord dans le module termios (si vous exécutez sur des systèmes non-POSIX). Vous pouvez également utiliser
new_settings[6][termios.VMIN]
etnew_settings[6][termios.VTIME]
pour définir si une lecture se bloquera s'il n'y a pas de données en attente, et combien de temps (en nombre entier de décisecondes). (IlVMIN
est généralement défini sur 0 etVTIME
sur 0 si les lectures doivent revenir immédiatement, ou sur un nombre positif (dixième de seconde) pendant combien de temps la lecture doit attendre au plus.)Comme vous pouvez le voir, ce qui précède (et "makeraw" en général) désactive toutes les traductions en entrée, ce qui explique le comportement du chat:
Pour obtenir un comportement normal, il suffit d'omettre les lignes effaçant ces trois lignes, et la traduction d'entrée est inchangée même lorsqu'elle est "brute".
La
new_settings[1] = new_settings[1] & ~termios.OPOST
ligne désactive tout le traitement de sortie, indépendamment de ce que disent les autres drapeaux de sortie. Vous pouvez simplement l'omettre pour garder le traitement de sortie intact. Cela maintient la sortie "normale" même en mode brut. (Cela n'affecte pas si l'entrée est automatiquement répercutée ou non; cela est contrôlé par leECHO
cflag innew_settings[3]
.)Enfin, lorsque de nouveaux attributs sont définis, l'appel réussit si l' un des nouveaux paramètres a été défini. Si les paramètres sont sensibles - par exemple, si vous demandez un mot de passe sur la ligne de commande -, vous devez obtenir les nouveaux paramètres et vérifier que les indicateurs importants sont correctement définis / désactivés, pour être sûr.
Si vous souhaitez voir vos paramètres de terminal actuels, exécutez
Les drapeaux d'entrée sont généralement sur la quatrième ligne et les drapeaux de sortie sur la cinquième ligne, avec un
-
précédant le nom du drapeau si le drapeau n'est pas défini. Par exemple, la sortie pourrait êtreSur les pseudoterminaux et les périphériques USB TTY, le débit en bauds n'est pas pertinent.
Si vous écrivez des scripts Bash qui souhaitent lire par exemple des mots de passe, considérez l'idiome suivant:
Le
EXIT
trap est exécuté à chaque sortie du shell. Lestty -g
lit les paramètres actuels du terminal au début du script, afin que les paramètres actuels soient restaurés automatiquement à la sortie du script. Vous pouvez même interrompre le script avec Ctrl+ C, et cela fera la bonne chose. (Dans certains cas d'angle avec des signaux, j'ai constaté que le terminal est parfois bloqué avec les paramètres bruts / non canoniques (en exigeant un pour taperreset
+ Enteraveuglément sur le terminal), mais courirstty sane
avant de restaurer les paramètres d'origine réels a guéri cela à chaque fois pour C'est pourquoi c'est là, une sorte de sécurité supplémentaire.)Vous pouvez lire les lignes d'entrée (sans écho sur le terminal) à l'aide de
read
bash intégré, ou même lire l'entrée caractère par caractère à l'aideSi vous ne définissez pas
IFS
sur ASCII NUL, la fonctionread
intégrée consommera les séparateurs, ce quic
sera vide. Piège pour jeunes joueurs.la source
Essentiellement "parce que c'est fait ainsi depuis les machines à écrire manuelles". Vraiment.
Une machine à écrire manuelle avait un chariot sur lequel le papier était alimenté, et elle avançait au fur et à mesure que vous tapiez (chargement d'un ressort), et avait un levier ou une clé qui libérerait le chariot, laissant le ressort ramener le chariot vers la marge gauche.
Au fur et à mesure de l'introduction de la saisie électronique des données (téléscripteur, etc.), ils l'ont fait avancer. Ainsi, la Enterclé sur de nombreux terminaux serait étiquetée Return.
Les sauts de ligne se sont produits (dans le processus manuel) après le retour du chariot à la marge gauche. Encore une fois, les appareils électroniques imitaient les appareils manuels, ce qui faisait une line-feedopération distincte .
Les deux opérations sont codées (pour permettre au télétype d'être plus qu'un périphérique autonome créant un type de papier), nous avons donc
CR
(retour chariot) etLF
(saut de ligne). Cette image de ASR 33 Teletype Information montre le clavier, avecReturn
sur le côté droit etLine-Feed
juste à gauche. Être à droite , c'était la clé principale:Unix est arrivé plus tard. Ses développeurs aimaient raccourcir les choses (regardez toutes les abréviations, même
creat
pour "créer"). Confrontés à un processus éventuellement en deux parties, ils ont décidé que les sauts de ligne n'avaient de sens que s'ils étaient précédés de retours chariot. Ils ont donc supprimé les retours chariot explicites des fichiers et traduit la Returnclé du terminal pour envoyer le saut de ligne correspondant. Pour éviter toute confusion, ils ont qualifié le saut de ligne de "saut de ligne".Lors de l'écriture de texte sur le terminal, Unix se traduit dans l'autre sens: un saut de ligne devient retour chariot / saut de ligne.
(C'est-à-dire "normalement": ce qu'on appelle le "mode cuit", contrairement au mode "brut" où aucune traduction n'est effectuée).
Sommaire:
la source
LF
est traduite enCR LF
. Lorsque vous tapezfoo<Return>
en mode cuit, l'application litfoo\n
etfoo\r\n
est renvoyée par la discipline de ligne pour écho au terminal.