Você precisa aguardar após o loop for
, portanto, processos filho atualmente ativos são esperados para:
for time in "${array[@]}"
do
test "$time" &
done
wait
Eu queria lançar vários comandos em paralelo usando um for
loop, cada comando pode demorar mais ou menos tempo, e eu quero chamar outro comando no final do script. Aqui está um exemplo mínimo:
#!/bin/bash
function test {
length=$1
sleep $length
echo "$length"
echo "-----"
}
# http://www.cyberciti.biz/faq/bash-for-loop-array/
array=( 5 1 3 )
for time in "${array[@]}"
do
test $time &
done
Aqui está o resultado:
$ bash ~/test.sh && echo "OK"
OK
$ 1
-----
3
-----
5
-----
Como você pode ver, OK
é exibido antes do script terminar, isso é lógico, pois chamei test
em segundo plano com &
. Não consigo adicionar um teste na última chamada test
, uma vez que pode terminar antes das outras chamadas. Eu gostaria que o script fosse encerrado somente quando todas as test
instâncias atendidas em background terminassem.
Aqui está o resultado que estou tentando obter:
$ bash ~/test.sh && echo "OK"
1
-----
3
-----
5
-----
OK
$
Como posso obter este resultado?
Você precisa aguardar após o loop for
, portanto, processos filho atualmente ativos são esperados para:
for time in "${array[@]}"
do
test "$time" &
done
wait
Tags bash shell-script