`unbuffer` ou` stdbuf` para remover o buffer stdout?

13

Existe uma diferença entre unbuffer (1) e stdbuf (1)? Pelo que entendi, o buffer não faz mais do que o "melhor esforço" de chamar a função libc set (X) buf no início e depois deixar as coisas acontecerem?

dan3
fonte

Respostas:

14

Eles trabalham de maneiras completamente diferentes.

O programa que o buffer de buffer usa espera executar o comando nomeado. Como o expect cria um pseudo-tty para anexar ao stdout do processo filho, o filho pode ser enganado ao pensar que deve usar buffer de linha em vez de buffer de bloco. Alguns programas mudam seu comportamento quando isatty (stdout) é verdadeiro, outros não e é muito difícil saber qual e o que não.

O programa stdbuf tenta colocar o libstdbuf na frente do libc para binários carregados dinamicamente. Onde libstdbuf redefine a estratégia de buffer padrão das chamadas libc stdio.

Eu descobri isso por

 apt-get source expect coreutils

e lendo a fonte relevante para cada programa.

msw
fonte
Algumas coisas preocupantes (da página de manual): unbuffer -ppodem parecer funcionar incorretamente se houver um processo que alimenta a entrada do buffer. Considere: process1 | unbuffer -p process2 | process3Se o processo1 sair, o processo2 poderá ainda não ter sido concluído. É impossível para unbuffer saber de esperar muito
dan3
Parece que o stdbuf também pode controlar o buffer stdin de programas que usam fluxos C, o que parece importante. Talvez isso deva ser incluído na resposta para o benefício de futuros leitores.
dan3