Vários pipes unix não funcionam

7

Este primeiro pipeline funciona bem (impressão "c"):

echo "a" | sed 's/a/b/' | sed 's/b/c/'

Este não faz o que eu espero (nada é impresso quando eu ponho um "a" no meu fifo):

mkfifo fifo;
cat fifo | sed 's/a/b/' | sed 's/b/c/' 

No entanto, se eu remover o segundo comando "sed" do último pipeline, receberei um "b" impresso. Acho que meu entendimento de pipes e redirecionamentos deve ser simplista demais. Alguém pode me explicar como consertar o segundo caso para que eu possa executar dois comandos sucessivos no conteúdo do fifo?

(note que este não é um problema específico do fifo, o mesmo comportamento ocorre com o netcat também. Eu postei um pergunta sobre o netcat mas não obteve respostas)

    
por Sridhar-Sarnobat 04.08.2014 / 08:20

1 resposta

8

Use a opção -u ( --unbuffered ) do sed, para que ele grave sua saída, em vez de coletá-la primeiro para uma gravação rápida e grande depois.

cat fifo | sed -u 's/a/b/' | sed -u 's/b/c/'

cat está sempre sem buffer.

Se não for sobre sed , mas algum programa com buffer de saída, mas sem opções para desabilitá-lo, existem ferramentas que podem ajudar a forçar o buffer off - veja man unbuffer e man stdbuf .

Se for um script de shell, ele deve ser unbuffered por padrão: quando um comando cria uma saída no script e sai, a saída é liberada. Caso contrário, você usa unbuffer dentro do script de shell.

Para informações básicas, consulte esta visão geral do armazenamento de dados Stary .

    
por 04.08.2014 / 08:37