bash
versão 4.4 introduziu uma nova linguagem útil chamada transformação de parâmetro que pode ajudá-lo neste caso. No snippet de código abaixo, observe o uso de ${num_jobs@P}
. O @P
é um tipo de transformação de parâmetro que faz com que a variável seja expandida como se fosse uma sequência de caracteres bash
. Veja man bash
para outras opções transformação de parâmetro .
#!/bin/bash
num_procs=$1
num_iters=$2
num_jobs="\j" # The prompt escape for number of jobs currently running
for ((i=0; i<num_iters; i++)); do
while (( ${num_jobs@P} >= num_procs )); do
wait -n
done
foo &
done
Créditos para chepner no link .
Após o comentário de Kusalananda, se necessário, a fim de tornar este grupo de processos independente de quaisquer outros trabalhos em segundo plano que possam afetar a contagem, você pode envolvê-los com seu próprio shell. Para isso, são necessárias algumas mudanças.
#!/bin/bash
# start a wrapper shell for the group of jobs
cat<<EOS | bash &
num_procs="$1"
num_iters="$2"
for ((i=0; i<num_iters; i++)); do
# escape what's not supposed to be expanded
# at the time of here-doc redirection
while (( \${num_jobs@P} >= num_procs )); do
wait -n
done
foo &
done
EOS
# now you can do other things