Poor man’s parallel con Bash

GNU Parallel es «una herramienta para ejecutar tareas en paralelo usando uno o varias computadoras». Es realmente compleja y versátil, pero muchas veces su uso se reduce a paralelizar un bucle. Algo así, para ejecutar 10 tasks utilizando 4 cores:

task() {
  echo "running $1..."
  sleep $(($1%4))
  echo "$1 stopped"
}
export -f task

for i in {1..10}; do
  sem -j4 task $i
done
sem --wait

Pero si no está disponible o da problemas, y no importa que la salida pueda intercalarse, se puede hacer lo mismo solo con Bash:

task() {
  echo "running $1..."
  sleep $(($1%4))
  echo "$1 stopped"
}
pmsem() { ((_i=_i%$1)); ((_i++==0)) && wait -n && ((_i--)); }

for i in {1..10}; do
  pmsem 4; task $i &
done
wait