executa um comando para cada linha de stdin imediatamente?

3

Como executo um comando para cada linha de stdin imediatamente?

Exemplo :

(echo abc; sleep 10; echo def;) | ???

A ferramenta xargs não faz o trabalho porque bloqueia até ver todos os dados (espera que o stdout feche). No entanto, tenho que executar comandos imediatamente quando novas linhas se tornam disponíveis.

    
por VasyaNovikov 22.12.2015 / 11:17

2 respostas

2

Usando o GNU Parallel:

(echo abc; sleep 10; echo def;sleep 10; echo def;)|parallel -uj1

-u é necessário para obter a saída imediatamente. Sem o comando será executado, mas a saída só será impressa posteriormente.

-j1 força a execução de um único joblot. Deixá-lo fora fará com que o GNU Parallel leia n jobs antes de iniciar, onde n = número de núcleos.

    
por 22.12.2015 / 14:57
1

Usando um script de shell como sugerido pelo @Hennes:

long_running_command | (
  while read -r LINE; do
    echo $LINE;
    command_to_execute "$LINE";
  done;
)
    
por 22.12.2015 / 12:05