O loop externo que você tem é basicamente
for i in {1..10}; do
some_compound_command &
done
Isso iniciaria dez instâncias simultâneas some_compound_command
em segundo plano. Eles serão iniciados o mais rápido possível, mas não totalmente "todos ao mesmo tempo" (ou seja, se some_compound_command
demorar muito pouco, o primeiro poderá terminar antes do início do último).
O fato some_compound_command
de ser um loop não é importante. Isso significa que o código que você mostra está correto , pois as iterações do j
loop interno serão executadas seqüencialmente, mas todas as instâncias do loop interno (uma por iteração do loop externo i
) serão iniciadas simultaneamente.
A única coisa a ter em mente é que cada trabalho em segundo plano será executado em um subshell. Isso significa que as alterações feitas no ambiente (por exemplo, modificações nos valores das variáveis do shell, alterações do diretório de trabalho atual com cd
, etc.) em uma instância do loop interno não serão visíveis fora desse trabalho em segundo plano específico.
O que você pode querer adicionar é uma wait
declaração após o loop, apenas para aguardar a conclusão de todos os trabalhos em segundo plano, pelo menos antes do término do script:
for i in {1..10}; do
for j in {1..10}; do
run_command "$i" "$j"
done &
done
wait