Isso não tem nada a ver com cat
, pipes ou buffering. Seu "problema" é upstreams, no dispositivo terminal.
Se cada caractere digitado no teclado no terminal estivesse disponível para leitura pelo seu aplicativo imediatamente e cat
, você poderia entrar a Backspace b Retornar , seu aplicativo leu a
, em seguida, ^?
, em seguida, b
, em seguida, ^M
, que não é o que você quer e não é o que você obtém. >
O que você quer e é para ler a^J
.
Você obtém isso porque no modo canônico padrão, o driver de dispositivo do terminal tty line discipline ) implementa um editor de linhas que permite inserir texto e editá-lo (com recursos limitados), e o texto digitado está disponível apenas para leitura quando você pressiona Retornar .
Para evitar isso, você pode dizer ao dispositivo terminal para sair do modo canônico . Por exemplo, fazendo stty raw
, você verá seu aplicativo e cat
obterá os caracteres imediatamente, mas provavelmente o comportamento não é o esperado.
Você também notará que, para outros tipos de entrada, como um canal, os caracteres são emitidos assim que chegam, como em:
(printf x; sleep 1; echo y) | that-command