Blocos de tubulação com a seguinte sequência de comandos [duplicados]

1

Eu tenho um script que lê um arquivo que contém URLs e depois imprime os endereços IP. No entanto, eu não consigo encontrar recursos sobre o porquê dos blocos de pipe quando eu adiciono o comando

cut -d" " -f4 

no final do tubo. Aqui está o comando completo.

for url in $(cat urls); do host $url; done | grep "has address" | cut -d" " -f4

A saída é impressa de forma assíncrona até o comando grep. Qualquer comando que venha depois do grep tem sua saída bloqueada até que todos os urls tenham sido processados pelo comando host. Alguém pode me dar uma ideia de por que isso acontece?

    
por MykelXIII 01.06.2016 / 13:10

1 resposta

1

grep buffers output se não gravar em um terminal. Você pode usar grep --line-buffered para produzir cada linha imediatamente. Considere:

executa o comando de saída lenta e o grep para o terminal:

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep to
printing
to grep
printing
to grep
printing
to grep

executa um comando de saída lenta e o grep para cortar:

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep to | cut -d" " -f1-2
printing
printing
printing
to grep
to grep
to grep

executa o comando de saída lenta e o grep para cortar usando a opção --line-buffered :

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep --line-buffered to | cut -d" " -f1-2
printing
to grep
printing
to grep
printing
to grep
    
por 01.06.2016 / 17:11