Combinação de eco, cachimbo e gato

4

Eu tenho um nome de arquivo chamado temp.csv no meu script. Uma das etapas intermediárias é

echo "some info" > final.csv | cat temp.csv >> final.csv

às vezes, o arquivo final.csv é criado sem dados que estão em temp.csv (quando está sendo executado pelo agendador). E então, quando eu re-executar o trabalho, o final.csv é criado como eu esperava.

Por que isso está acontecendo assim (o que exatamente acontece no comando echo "some info" > final.csv | cat temp.csv >> final.csv )?
Se eu substituir o comando da seguinte maneira:

echo "some info" > final.csv ; cat temp.csv >> final.csv 

esta modificação será útil?

    
por Aravind 30.10.2014 / 11:30

2 respostas

4

Você está canalizando a saída de echo "some info" > final.csv para cat temp.csv >> final.csv , então esses dois comandos ( echo e cat ) são executados em paralelo.

Por causa disso, o que acaba no final.csv depende de qual programa é agendado. O que você quer fazer é substituir | por ; . E então o comando echo será executado até terminar, e somente então cat é iniciado.

    
por 30.10.2014 / 11:39
1

| mean pipe == saída do comando anterior canalizada para próxima entrada de comando. Se você usa > final.csv que redireciona a saída de echo para o arquivo e não é nada para o pipe. Então, para corrigi-lo, use 2 comandos separadamente, como você ofereceu acima, ou use pipe se quiser

echo "some info" | cat - temp.csv > final.csv

Outros fazem o mesmo

cat - temp.csv <<<"some info" > final.csv
    
por 30.10.2014 / 11:44