Unix / Linux EOL es LF, salto de línea, ASCII 10, secuencia de escape \n
.
Aquí hay un fragmento de Python para obtener exactamente una pulsación de tecla:
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
Cuando presiono Entermi teclado en respuesta a este fragmento \r
, aparece el retorno de carro ASCII 13.
En Windows , Enterenvía CR LF == 13 10
. * nix no es Windows; ¿Por qué Enterda 13 en lugar de 10?
Respuestas:
Si bien la respuesta de Thomas Dickey es bastante correcta, Stéphane Chazelas mencionó correctamente en un comentario a la respuesta de Dickey que la conversión no está escrita en piedra; Es parte de la disciplina de línea.
De hecho, la traducción es completamente programable.
La página del manual man 3 termios contiene básicamente toda la información pertinente. (El enlace lleva al proyecto de páginas de manual de Linux , que menciona qué características son exclusivas de Linux y cuáles son comunes a POSIX u otros sistemas; siempre revise la sección Conforme a en cada página allí).
Los
iflag
atributos del terminal (old_settings[0]
en el código que se muestra en la pregunta en Python ) tienen tres indicadores relevantes en todos los sistemas POSIXy:INLCR
: Si está configurado, traduzca NL a CR en la entradaICRNL
: Si está configurado (yIGNCR
no está configurado), traduzca CR a NL en la entradaIGNCR
: Ignorar CR en entradaDel mismo modo, también hay configuraciones de salida relacionadas (
old_settings[1]
):OPOST
: Habilita el procesamiento de salida.OCRNL
: Asigna CR a NL en la salida.ONLCR
: Asigna NL a CR en la salida. (XSI; no disponible en todos los sistemas POSIX o Single-Unix-Specification).ONOCR
: Omitir (no generar) CR en la primera columna.ONLRET
: Saltar (no emitir) CR.Por ejemplo, podría evitar depender del
tty
módulo. La operación "makeraw" simplemente borra un conjunto de banderas (y establece elCS8
oflag):aunque por razones de compatibilidad, es posible que desee verificar si todas esas constantes existen primero en el módulo termios (si se ejecuta en sistemas que no son POSIX). También puede usar
new_settings[6][termios.VMIN]
ynew_settings[6][termios.VTIME]
establecer si una lectura se bloqueará si no hay datos pendientes y cuánto tiempo (en un número entero de decisegundos). (PorVMIN
lo general, se establece en 0 yVTIME
en 0 si las lecturas deben regresar de inmediato, o en un número positivo (décima de segundos) cuánto tiempo debe esperar la lectura como máximo).Como puede ver, lo anterior (y "makeraw" en general) desactiva toda traducción en la entrada, lo que explica el comportamiento que está viendo cat:
Para obtener un comportamiento normal, simplemente omita las líneas que borran esas tres líneas, y la traducción de entrada no cambia incluso cuando está "sin procesar".
La
new_settings[1] = new_settings[1] & ~termios.OPOST
línea deshabilita todo el procesamiento de salida, independientemente de lo que digan los otros indicadores de salida. Puede omitirlo para mantener intacto el procesamiento de salida. Esto mantiene la salida "normal" incluso en modo sin procesar. (No afecta si la entrada se repite automáticamente o no; eso es controlado por elECHO
cflag innew_settings[3]
.)Finalmente, cuando se establecen nuevos atributos, la llamada será exitosa si se estableció alguna de las nuevas configuraciones. Si la configuración es delicada, por ejemplo, si solicita una contraseña en la línea de comando, debe obtener la nueva configuración y verificar que los indicadores importantes estén correctamente activados / desactivados, para estar seguro.
Si desea ver la configuración actual de su terminal, ejecute
Los indicadores de entrada suelen estar en la cuarta línea, y los indicadores de salida en la quinta línea, con un
-
nombre de indicador anterior si el indicador no está establecido. Por ejemplo, la salida podría serEn pseudoterminales y dispositivos USB TTY, la velocidad de transmisión es irrelevante.
Si escribe scripts de Bash que desean leer, por ejemplo, contraseñas, considere el siguiente modismo:
La
EXIT
trampa se ejecuta cada vez que sale el shell. Elstty -g
lee la configuración actual del terminal en el inicio de la secuencia de comandos, por lo que los ajustes actuales se restauran cuando las salidas de guión, de forma automática. Incluso puede interrumpir el script con Ctrl+ C, y hará lo correcto. (En algunos casos de esquina con señales, descubrí que el terminal a veces se atasca con la configuración sin formato / no canónica (que requiere que uno escribareset
+Enter ciegas en el terminal), pero la ejecuciónstty sane
antes de restaurar la configuración original real lo ha curado todo el tiempo yo. Entonces es por eso que está ahí; una especie de seguridad adicional).Puede leer las líneas de entrada (sin eco al terminal) utilizando
read
bash incorporado, o incluso leer la entrada carácter por carácter utilizandoSi no establece
IFS
ASCII NUL, elread
incorporado consumirá los separadores, por lo quec
estará vacío. Trampa para jugadores jóvenes.fuente
Esencialmente "porque se ha hecho así desde máquinas de escribir manuales". De Verdad.
Una máquina de escribir manual tenía un carro en el que se alimentaba el papel, y se movía hacia adelante mientras escribía (cargando un resorte), y tenía una palanca o llave que soltaba el carro, permitiendo que el resorte volviera el carro al margen izquierdo.
Cuando se introdujo el ingreso electrónico de datos (teletipo, etc.), lo llevaron adelante. Entonces la Enterclave en muchas terminales estaría etiquetada Return.
Los avances de línea ocurrieron (en el proceso manual) después de devolver el carro al margen izquierdo. Una vez más, los dispositivos electrónicos imitaron a los dispositivos manuales, haciendo una line-feedoperación separada .
Ambas operaciones están codificadas (para permitir que el teletipo sea más que un dispositivo independiente que crea un tipo de papel), por lo que tenemos
CR
(retorno de carro) yLF
(avance de línea). Esta imagen de la información del teletipo ASR 33 muestra el teclado, conReturn
el lado derecho yLine-Feed
justo a la izquierda. Estar a la derecha , era la clave principal:Unix llegó más tarde. A sus desarrolladores les gustaba acortar las cosas (mira todas las abreviaturas, incluso
creat
para "crear"). Ante un proceso posiblemente de dos partes, decidieron que los avances de línea solo tenían sentido si iban precedidos de retornos de carro. Así que descartaron los retornos de carro explícitos de los archivos y tradujeron el terminalReturn clave para enviar el avance de línea correspondiente. Solo para evitar confusiones, se refirieron al avance de línea como "nueva línea".Al escribir texto en el terminal, Unix traduce en la otra dirección: un avance de línea se convierte en retorno de carro / avance de línea.
(Es decir, "normalmente": llamado "modo cocinado", en contraste con el modo "sin procesar" donde no se realiza la traducción).
Resumen:
fuente
LF
se traduceCR LF
. Cuando escribefoo<Return>
en modo cocinado, la aplicación leefoo\n
yfoo\r\n
la disciplina de línea la envía de vuelta para que se repita en el terminal.