Existe alguma maneira de ler linhas da saída do comando?

5

Eu tenho um comando pre process para gerar um arquivo

./preprocess.sh > preprocessed_file 

e o preprocessed_file será usado assim

while read line
do

    ./research.sh $line &

done < preprocessed_file 

rm -f preprocessed_file

Existe alguma maneira de direcionar a saída para a parte while read line em vez de enviar para o arquivo pré-processado? Eu acho que deveria haver uma maneira melhor diferente de usar este temp preprocessed_file .

    
por Marcus Thornton 25.08.2014 / 12:07

2 respostas

7

Você pode usar a bash substituição de processos :

while IFS= read -r line; do
  ./research.sh "$line" &
done < <(./preprocess.sh)

Algumas vantagens da substituição de processos:

  • Não é necessário salvar arquivos temporários.
  • Melhor desempenho. Ler de outro processo com frequência mais rápido do que gravar no disco e, em seguida, ler novamente.
  • Economize tempo para cálculo desde quando ele é executado simultaneamente com expansão de parâmetro e variável, substituição de comando e expansão aritmética
por 25.08.2014 / 12:09
14

Sim! Você pode usar um canal de processo | .

./preprocess.sh |
    while IFS= read -r line
    do
        ./research.sh "$line" &
    done

Um pipe de processo passa a saída padrão ( stdout ) de um processo para a entrada padrão ( stdin ) do próximo.

Opcionalmente, você pode colocar um caractere de nova linha após um | e estender o comando para a próxima linha.

Nota: a|b é equivalente a b < <(a) , mas sem os arquivos mágicos, e em uma ordem mais legível, especialmente quando o pipeline fica mais longo.

a|b|c é equivalente a c < <(b < <(a))

e

a|b|c|d|e é e < < (d < <(c < <(b < <(a))))

    
por 25.08.2014 / 12:26