Boucles for avec "&" ou ";"

La principale différence entre ces 2 boucles for est que la 1ère fait de l’exécution parallèle (&) et l’autre séquentielle (;) des processus :

# for i in {1..3}; do md5sum /dev/zero & done
# for i in {1..3}; do md5sum /dev/zero; done

Commande avec & ou exécution en arrière-plan

Commande pour une éxécution en arrière-plan :

# for i in {1..3}; do md5sum /dev/zero & done

Dans cette commande :

  • La boucle for itère 3 fois
  • À chaque itération, la commande md5sum /dev/zero est exécutée en arrière-plan grâce à &
  • Les 3 instances de la commande sont lancées simultanément et s`exécutent en parallèle
  • Le terminal revient immédiatement après avoir lancé les processus (sans attendre que chaque md5sum se termine, car ils tournent en arrière-plan).

Commande sans & ou exécution séquentielle

Commande pour une éxécution séquentielle :

# for i in {1..3}; do md5sum /dev/zero; done

Dans cette commande :

  • La boucle for itère 3 fois
  • À chaque itération, la commande md5sum /dev/zero est exécutée de manière séquentielle
    • la boucle attend que la commande de chaque itération se termine avant de passer à l`itération suivante
  • Le fichier /dev/zero génère un flux infini de zéros et donc la 1ère itération tourne indéfiniment
    • les suivantes ne démarreront donc jamais

Résumé

Avec & : exécution en parallèle de plusieurs instances :

# for i in {1..3}; do md5sum /dev/zero & done

Les 3 processus de calcul MD5 sont lancés en parallèle, et la boucle se termine rapidement (mais les processus continuent de tourner en arrière-plan).


Avec ; : exécution séquentielle une instance doit se terminer avant que la suivante ne commence :

# for i in {1..3}; do md5sum /dev/zero; done

La 1ère instance de md5sum /dev/zero s’exécute indéfiniment, bloquant les itérations suivantes.
La 2ème et la 3ème instance ne démarrent jamais tant que la 1ère n`est pas terminée, et ne se produit jamais ici.

Documentation

ChatGPT

> Partager <