O bash faz com que o terminal traduza uma nova linha (\n) em um retorno de carro (\r)?

O bash faz com que o terminal traduza uma nova linha (\n) em um retorno de carro (\r)?

Abri dois terminais e, no terminal abaixo, executei catpara ler o terminal acima:

insira a descrição da imagem aqui

No terminal acima eu digito "Hello World<Enter>Bye", mas parece que o terminal acima enviou a Enterchave como um retorno de carro ( \r).

O mesmo acontece bashcom as configurações do terminal para que ele traduza uma nova linha ( \n) em um retorno de carro ( \r)?

Responder1

Bash mudou o terminal para o modo “bruto”, o que significa que os caracteres digitados não são processados ​​de forma alguma. A tecla Enter produz um caractere de retorno de carro (\r), não um avanço de linha (\n), portanto, nenhuma tradução ocorre.

Responder2

cruecozinhoumodos são termos descritivos. stty rawusa configurações diferentes do bash.

Bash faz a inicialização do terminal emprepare_terminal_settings(uma função interna da biblioteca readline), configurando o modo do terminal para permitir a leitura de um único caractere por vez sem eco:

  tiop->c_lflag &= ~(ICANON | ECHO);

no entanto, a tradução de retorno de carro é redefinida em umparte diferente da função:

  /* Make sure we differentiate between CR and NL on input. */
  tiop->c_iflag &= ~(ICRNL | INLCR);

Se você comparar prepare_terminal_settingscom ocoreutilsstty, o último faz menos (vários pontos, mas o bash INLCRtambém reinicia):

      senão if (STREQ (info->nome, "cru") || STREQ (info->nome, "cozido"))
        {
          if ((info->nome[0] == 'r' && invertido)
              || (info->nome[0] == 'c' && !invertido))
            {
              /* Modo cozido. */
              modo->c_iflag |= BRKINT | IGNPAR | ISTRIP | ICRNL | IXÔNIO;
              modo->c_oflag |= OPOST;
              modo->c_lflag |= ISIG | ICANO;
#if VMIN == VEOF
              modo->c_cc[VEOF] = CEOF;
#fim se
#if VTIME == VEOL
              modo->c_cc[VEOL] = CEOL;
#fim se
            }
          outro
            {
              /* Modo bruto. */
              modo->c_iflag = 0;
              modo->c_oflag &= ~OPOST;
              modo->c_lflag &= ~(ISIG | ICANON
#ifdef CASO
                                 | CASO
#fim se
                );
              modo->c_cc[VMIN] = 1;
              modo->c_cc[VTIME] = 0;
            }
        }

POSIX diz destty raw:

Habilite (desabilite) entrada e saída brutas. O modo bruto será equivalente à configuração:

stty cs8 erase ^- kill ^- intr ^- \
    quit ^- eof ^- eol ^- -post -inpck

o que curiosamente (seguindo as descrições de -poste -inpck) não aborda a tradução de retorno de carro na entrada.

Já que os termoscruecozinhou(POSIX ou coreutils stty) não correspondem ao que o bash faz, mencionando que os recursos dos termios POSIX que correspondem ao que ele realmente faz são o caminho a seguir:icrnl(entrada retorno de carro para tradução de nova linha).

informação relacionada