Como tornar a saída de qualquer comando shell sem buffer?

Existe uma maneira de executar comandos shell sem buffer de saída?

Por exemplo, hexdump file | ./my_script hexdump file | ./my_script só passará a input do hexdump para my_script em blocos armazenados, não linha por linha.

Na verdade, eu quero saber uma solução geral como tornar qualquer comando sem buffer?

AFAIK, você não pode fazer isso sem hacks feios. Escrevendo para um pipe (ou lendo a partir dele) ativa automaticamente o buffer completo e não há nada que você possa fazer sobre isso :-(. “Buffer de linha” (que é o que você quer) é usado somente ao ler / gravar um terminal. hacks feios fazem exatamente isso: eles conectam um programa a um pseudo-terminal, de modo que as outras ferramentas no pipe leiam / escrevam a partir daquele terminal no modo de buffer de linha, todo o problema é descrito aqui:

A página também tem algumas sugestões (os “hacks feios” acima mencionados) o que fazer, ou seja, usar unbuffer ou puxar alguns truques com LD_PRELOAD .

Tente stdbuf , incluído no GNU coreutils e, portanto, virtualmente qualquer distribuição do Linux. Isso define o tamanho do buffer para input, saída e erro como zero:

 stdbuf -i0 -o0 -e0 command 

O comando unbuffer do pacote expect desativa o buffer de saída:
Ubuntu Manpage: unbuffer – unbuffer output

Exemplo de uso:

 unbuffer hexdump file | ./my_script 

Você também pode usar o comando script para fazer a saída do hexdump line-buffered (o hexdump será executado em um pseudo-terminal que engana o hexdump pensando em gravar seu stdout em um terminal, e não em um pipe).

 # cf. http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe/ stty -echo -onlcr script -q /dev/null hexdump file | ./my_script # FreeBSD, Mac OS X script -q -c "hexdump file" /dev/null | ./my_script # Linux stty echo onlcr