![O bash faz com que o terminal traduza uma nova linha (\n) em um retorno de carro (\r)?](https://rvso.com/image/111971/O%20bash%20faz%20com%20que%20o%20terminal%20traduza%20uma%20nova%20linha%20(%5Cn)%20em%20um%20retorno%20de%20carro%20(%5Cr)%3F.png)
Abri dois terminais e, no terminal abaixo, executei cat
para ler o terminal acima:
No terminal acima eu digito "Hello World<Enter>Bye"
, mas parece que o terminal acima enviou a Enter
chave como um retorno de carro ( \r
).
O mesmo acontece bash
com 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 raw
usa 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_settings
com ocoreutilsstty
, o último faz menos (vários pontos, mas o bash INLCR
també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 -post
e -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).