HOWTO · Bash

Comment mettre en pause un script Bash pendant X secondes

Découvrez comment utiliser read et sleep dans Bash pour mettre un script en pause

Sur cette page

Un script Bash peut faire une pause pour laisser le temps de lire un message, attendre une saisie interactive ou insérer un délai entre des commandes. Utilisez sleep pour attendre un nombre entier de secondes et read lorsque le script doit attendre une saisie. Ces pauses déterminent quand le script reprend ; un délai ne synchronise pas l’accès à des fichiers partagés.

Mettre un script Bash en pause pendant X secondes

Utilisez sleep avec un nombre entier de secondes pour retarder la commande suivante. La durée est obligatoire. Le manuel de sleep décrit cette commande ; la prise en charge des valeurs fractionnaires ou des suffixes d’unité dépend de l’implémentation de sleep installée sur le système.

Ce script Bash complet affiche un message, attend une seconde, puis affiche un autre message :

#!/usr/bin/env bash
printf '%s\n' 'The script is starting.'
sleep 1
printf '%s\n' 'One second wait requested.'

La durée demandée est un objectif, pas une garantie de temps écoulé exact : l’ordonnanceur du système peut prolonger l’attente. Pour répéter une action après une pause d’un nombre entier de secondes, placez l’action et sleep dans une boucle. Limitez la boucle à cette action afin que l’effet de chaque répétition soit clair.

Mettre un script Bash en pause pendant une durée variable

Stockez la durée en secondes entières dans une variable et mettez son expansion entre guillemets lorsque vous la transmettez à sleep. Ce script utilise cinq secondes par défaut ; définissez N dans l’environnement pour choisir une autre valeur :

#!/usr/bin/env bash
N=${N:-5}
sleep "$N"
printf 'Requested a %s-second wait.\n' "$N"

Par exemple, N=8 ./your-script.sh définit la valeur pour une seule exécution. La valeur doit constituer une durée valide pour la commande sleep installée. Les guillemets empêchent le découpage en mots et l’expansion des motifs de fichiers, mais ne rendent pas valide une valeur arbitraire. Validez donc les valeurs provenant d’utilisateurs ou d’autres sources non fiables.

Dans Bash, vous pouvez réduire $RANDOM à une plage pour obtenir un délai aléatoire borné, en secondes entières. Le script suivant demande une attente de une à trois secondes :

#!/usr/bin/env bash
delay=$((1 + RANDOM % 3))
printf 'Requested a %s-second wait.\n' "$delay"
sleep "$delay"

Un délai aléatoire peut faire varier l’heure de démarrage de plusieurs exécutions du script, mais il ne garantit pas que deux exécutions éviteront d’écrire simultanément dans le même fichier. Si les scripts partagent des ressources, utilisez un mécanisme de verrouillage ou de coordination adapté.

Mettre un script Bash en pause jusqu’à une saisie utilisateur

La commande Bash read attend une ligne sur l’entrée standard. Dans un terminal interactif, l’utilisateur termine généralement la ligne en appuyant sur Entrée. L’option -r conserve les barres obliques inverses saisies, tandis que -p affiche une invite :

#!/usr/bin/env bash
if read -r -p 'Press Enter to continue: ' reply; then
    printf '%s\n' 'Continuing.'
else
    printf '%s\n' 'No input line was available.'
fi

Ce modèle suppose une saisie interactive et peut attendre indéfiniment une ligne. Si l’entrée standard atteint la fin du fichier ou est redirigée, read peut se terminer sans en recevoir ; vérifier son statut permet au script de gérer ce cas. Le manuel Bash, référence de read décrit ses options et son comportement.

Combiner une pause temporisée et une saisie utilisateur

Utilisez read -t lorsque la saisie doit mettre fin à l’attente avant l’échéance et qu’un délai maximal doit aussi permettre au script de continuer. Le délai est exprimé en secondes ; l’ordonnanceur du système peut prolonger le temps écoulé. Cet exemple indique quel événement a permis au script de reprendre :

#!/usr/bin/env bash
if read -r -t 5 -p 'Continue now, or wait for the timeout: ' reply; then
    printf '%s\n' 'Input received; continuing.'
else
    printf '%s\n' 'No line was read before the wait ended; continuing.'
fi

Pour laisser l’utilisateur choisir un délai en secondes entières, lisez la valeur dans une variable et transmettez-la entre guillemets à sleep. Cette version vérifie que la saisie est numérique et comporte au plus trois chiffres avant d’appeler sleep. Elle indique également qu’aucune ligne adaptée n’a été reçue :

#!/usr/bin/env bash
if read -r -p 'Enter a whole number of seconds (up to 3 digits): ' duration \
    && [[ $duration =~ ^[0-9]{1,3}$ ]]; then
    sleep "$duration"
    printf 'Requested a %s-second wait.\n' "$duration"
else
    printf '%s\n' 'Enter a whole number with at most 3 digits.'
fi

La valeur est vérifiée avant d’être transmise à sleep, ce qui évite de lui fournir un texte mal formé comme durée. Adaptez la plage acceptée aux besoins de votre script et indiquez clairement ces limites à ses utilisateurs.

En bref, utilisez sleep pour attendre un nombre entier de secondes et read pour attendre une saisie. read -t combine les deux : l’attente prend fin lorsqu’une ligne arrive ou que le délai expire.