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