¿Bash hace que la terminal traduzca una nueva línea (\n) en un retorno de carro (\r)?

¿Bash hace que la terminal traduzca una nueva línea (\n) en un retorno de carro (\r)?

Abrí dos terminales y desde la terminal siguiente ejecuté catpara leer desde la terminal anterior:

ingrese la descripción de la imagen aquí

En la terminal anterior escribo "Hello World<Enter>Bye", pero parece que la terminal anterior envió la Enterclave como un retorno de carro ( \r).

Entonces, ¿ bashcambia 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 rawutiliza 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_settingscon elcoreutilsstty, este último hace menos (varios puntos, pero bash INLCRtambié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 -posty -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).

información relacionada