![¿Bash hace que la terminal traduzca una nueva línea (\n) en un retorno de carro (\r)?](https://rvso.com/image/111971/%C2%BFBash%20hace%20que%20la%20terminal%20traduzca%20una%20nueva%20l%C3%ADnea%20(%5Cn)%20en%20un%20retorno%20de%20carro%20(%5Cr)%3F.png)
Abrí dos terminales y desde la terminal siguiente ejecuté cat
para leer desde la terminal anterior:
En la terminal anterior escribo "Hello World<Enter>Bye"
, pero parece que la terminal anterior envió la Enter
clave como un retorno de carro ( \r
).
Entonces, ¿ bash
cambia la configuración del terminal para que traduzca una nueva línea ( \n
) a un retorno de carro ( \r
)?
Respuesta1
Bash ha cambiado la terminal al modo "sin formato", lo que significa que los caracteres mecanografiados no se procesan de ninguna manera. La tecla Intro produce un carácter de retorno de carro (\r), no un salto de línea (\n), por lo que no se realiza ninguna traducción.
Respuesta2
crudoycocidoLos modos son términos descriptivos. stty raw
utiliza configuraciones diferentes a bash.
Bash realiza la inicialización del terminal enpreparar_terminal_settings(una función interna de la biblioteca readline), configurando el modo terminal para permitir leer un solo carácter a la vez sin eco:
tiop->c_lflag &= ~(ICANON | ECHO);
sin embargo, la traducción de retorno de carro se restablece en unparte diferente de la función:
/* Make sure we differentiate between CR and NL on input. */
tiop->c_iflag &= ~(ICRNL | INLCR);
Si se compara prepare_terminal_settings
con elcoreutilsstty
, este último hace menos (varios puntos, pero bash INLCR
también se reinicia):
else if (STREQ (info->nombre, "crudo") || STREQ (info->nombre, "cocido")) { if ((info->nombre[0] == 'r' && invertido) || (información->nombre[0] == 'c' &&!revertido)) { /* Modo cocido. */ modo->c_iflag |= BRKINT | IGNPAR | ESTRIP | ICRNL | IXÓN; modo->c_oflag |= OPOST; modo->c_lflag |= ISIG | ICANÓN; #si VMIN == VEOF modo->c_cc[VEOF] = CEOF; #terminara si #si VTIME == VEOL modo->c_cc[VEOL] = CEOL; #terminara si } demás { /* Modo sin procesar. */ modo->c_iflag = 0; modo->c_oflag &= ~OPOST; modo->c_lflag &= ~(ISIG | ICANON #ifdef XCASO | XCASO #terminara si ); modo->c_cc[VMIN] = 1; modo->c_cc[VTIME] = 0; } }
POSIX dice destty raw
:
Habilite (deshabilite) la entrada y salida sin procesar. El modo sin procesar será equivalente a configurar:
stty cs8 erase ^- kill ^- intr ^- \
quit ^- eof ^- eol ^- -post -inpck
que curiosamente (siguiendo las descripciones de -post
y -inpck
) no aborda la traducción del retorno de carro en la entrada.
Desde los términoscrudoycocido(ya sea POSIX o coreutils stty) no corresponden a lo que hace bash, mencionar las características de termios POSIX que corresponden a lo que realmente hace es el camino a seguir:icrnl
(entrada de retorno de carro a traducción de nueva línea).