Esse buffer é feito pelo pipe quando o descritor envolvido não é um tty. Alguns comandos têm opções específicas para lidar com isso e forçar um comportamento interativo.
Maneira genérica de lidar com isso
Você pode usar stdbuf
do GNU Coreutils. Ele gerencia o buffer de stdin
, stdout
e stderr
. Você pode desabilitá-lo completamente definindo-o como 0
ou usar um buffer de linha definindo-o como L
:
stdbuf -i0 -o0 -e0 command
stdbuf -oL ping example.com
Esse comando funciona definindo setvbuf()
por meio de LD_PRELOAD
hack. Se o comando chamado chamar forçosamente essa função novamente, stdbuf
poderá falhar ao desabilitar o buffer.
Você também pode usar o comando unbuffer
para obter basicamente o mesmo resultado. Este comando está relacionado a expect
e pode não ser instalado por padrão. Pode ser usado basicamente da seguinte forma:
unbuffer command
Opções específicas de comandos
Em relação ao buffer específico do comando, veja como desativá-lo:
A opção - GNU
grep
desativa o buffer: --line-buffered
A opção - GNU
sed
desativa o buffer: -u
- O GNU
awk
não é armazenado em buffer quando não há controle tty.
-
mawk
, o padrão awk para - pelo menos - Debian / Ubuntu, faz buffer de saída. mawk
may não funciona com stdbuf
e fornece uma opção -Winteractive
para desativar o armazenamento em buffer.