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 |
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