No bash, você pode passar dados do passo a passo, canalizando dados:
program1 | program2 | program3 | ...
Ou você pode fazer isso com variáveis (dependendo de como cada programa funciona):
RES1=$(program1)
RES2=$(program2 $RES1)
...
Eu estou procurando uma contraparte de tais dados de passagem em paralelo.
Eu tento converter meu script "linear" para o incrível paralelo (essa ferramenta ainda faz maravilhas para mim :-D), mas eu tenho um problema com a leitura e usando a saída da primeira etapa. Versão original:
for fn in $(ls $REV *)
do
DATA=$(sh script1.sh ${fn})
sh script2.sh $DATA
done
Veja como tentei fazer isso com parallel
:
ls $REV * | parallel -j+0 DATA=$(sh script1.sh {}) \; sh script2.sh $DATA
No entanto, com este código myscript
obtém alguns dados quebrados na entrada. Versão com leitura removida do resultado e segundo passo em conjunto, funciona:
ls $REV * | parallel -j+0 sh script1.sh {}
Então, como ler a saída da primeira etapa de parallel
e usá-la nas próximas etapas?
PROBLEMA
Para facilitar a depuração, digamos que meu primeiro script (script1.sh) seja:
echo "RECEIVED THIS ${1}"
E o script principal é:
ls * | parallel -j+0 RES="$(sh script1.sh {})"
(Eu pulei o script2 aqui para testar a captura da saída do script1). Então o resultado da execução inteira é este:
/bin/bash: THIS: command not found
/bin/bash: THIS: command not found
/bin/bash: THIS: command not found
...
Tags bash gnu-parallel