Somente read -r
é especificado por POSIX ; read -n NUM
, usado para ler NUM
caracteres, não é. Existe uma maneira portátil de retornar automaticamente depois de ler um determinado número de caracteres de stdin?
Meu caso de uso está imprimindo prompts como este:
Do the thing? [y/n]
Se possível, gostaria que o programa continuasse automaticamente após digitar y
ou n
, sem precisar que o usuário pressione enter depois.
Ler um caractere significa ler um byte de cada vez até obter um caractere completo.
Para ler um byte com a caixa de ferramentas POSIX, há
dd bs=1 count=1
.Observe no entanto a leitura de um dispositivo terminal, quando esse dispositivo está em
icanon
modo (como geralmente é por padrão), só retorna quando você pressiona Return(aka Enter), porque até então o driver do dispositivo terminal implementa uma forma de editor de linha que permite que você use Backspaceou outros caracteres de edição para alterar o que você digita, e o que você digita é disponibilizado para o aplicativo de leitura somente quando você envia a linha que está editando (com Returnou Ctrl+ D).Por essa razão,
ksh
'sread -n/N
ouzsh
'sread -k
, quando detectam que stdin é um dispositivo terminal, colocam esse dispositivo fora doicanon
modo, para que os bytes estejam disponíveis para leitura assim que forem enviados pelo terminal.Agora observe que só lê até caracteres
ksh
de uma única linha , ele ainda para quando um caractere de nova linha é lido (use para ler caracteres). , ao contrário do ksh93, ainda faz o processamento de IFS e barra invertida para ambos e .read -n n
n
-N n
n
bash
-n
-N
Para imitar
zsh
'sread -k
ouksh93
'sread -N1
oubash
'sIFS= read -rN 1
, ou seja, leia um e apenas um caractere de stdin, POSIXly:Citando esta resposta ... isso funciona para mim com o bash:
Outra solução com dd: