Quando você lê uma linha inteira com read
(ou read -r
ou outras opções que não afetam esse comportamento), o editor de linha fornecido pelo kernel reconhece a tecla Backspace para apagar um caractere, bem como alguns outros comandos (incluindo Return para terminar a linha de entrada e enviá-la). As teclas de atalho podem ser configuradas com o stty
. Diz-se que o terminal está no modo cozido quando seu editor de linhas está ativo. No modo raw, cada caractere digitado no teclado é transmitido para o aplicativo imediatamente. No modo cozido, os caracteres são armazenados em um buffer e somente linhas completas são transmitidas para o aplicativo.
Para interromper a leitura após um número fixo de caracteres, de forma a implementar read -n
, o bash precisa alternar para o modo raw. No modo raw, o terminal não faz nenhum processamento da tecla Backspace (no momento em que você pressiona Backspace , o caractere anterior já foi enviado para o bash), e O bash também não faz nenhum processamento (presumivelmente porque isso dá a maior flexibilidade de permitir que o script faça seu próprio processamento).
Você pode passar a opção -e
para habilitar o próprio editor de linhas do bash (readline, que é um editor de linhas apropriado, não como o extremamente bruto do kernel). Como o bash está fazendo a edição de linha, ele pode parar de ler uma vez que tenha o número de caracteres solicitado.