220 votes

Y a-t-il un moyen d'afficher un compte à rebours ou un minuteur de chronomètre dans un terminal?

Comment puis-je afficher un minuteur de compte à rebours en temps réel sur le terminal Linux ? Existe-t-il une application existante ou, encore mieux, une seule ligne de code pour le faire ?

260voto

Mohsin Points 11

Je ne suis pas sûr pourquoi vous avez besoin de beep. Si tout ce que vous voulez est un chronomètre, vous pouvez faire ceci :

while true; do printf '%s\r' "$(date)"; done

Cela vous montrera les secondes qui passent en temps réel et vous pouvez l'arrêter avec Ctrl+C. Si vous avez besoin d'une plus grande précision, vous pouvez utiliser ceci pour vous donner des nanosecondes :

while true; do printf '%s\r' "$(date +%H:%M:%S:%N)"; done

Enfin, si vous voulez vraiment le format "chronomètre", où tout commence à 0 et commence à croître, vous pourriez faire quelque chose comme ceci :

start=$(date +%s)
while true; do
    time="$(($(date +%s) - $start))"
    printf '%s\r' "$(date -u -d "@$time" +%H:%M:%S)"
done

Pour un minuteur de compte à rebours (ce qui n'est pas ce que votre question d'origine demandait), vous pourriez faire ceci (changer les secondes en conséquence) :

seconds=20
start="$(($(date +%s) + $seconds))"
while [ "$start" -ge `date +%s` ]; do
    time="$(( $start - `date +%s` ))"
    printf '%s\r' "$(date -u -d "@$time" +%H:%M:%S)"
done

Vous pouvez combiner ces commandes en commandes simples en utilisant des fonctions bash (ou le shell que vous préférez). En bash, ajoutez ces lignes à votre ~/.bashrc (le sleep 0.1 fera attendre au système 1/10ème de seconde entre chaque exécution pour éviter de surcharger votre CPU) :

countdown() {
    start="$(( $(date '+%s') + $1))"
    while [ $start -ge $(date +%s) ]; do
        time="$(( $start - $(date +%s) ))"
        printf '%s\r' "$(date -u -d "@$time" +%H:%M:%S)"
        sleep 0.1
    done
}

stopwatch() {
    start=$(date +%s)
    while true; do
        time="$(( $(date +%s) - $start))"
        printf '%s\r' "$(date -u -d "@$time" +%H:%M:%S)"
        sleep 0.1
    done
}

Vous pouvez alors démarrer un minuteur de compte à rebours d'une minute en exécutant :

countdown 60

Vous pouvez démarrer un compte à rebours de deux heures avec :

countdown "$((2 * 60 * 60))"

ou une journée entière en utilisant :

countdown "$((24 * 60 * 60))"

Et démarrer le chronomètre en exécutant :

stopwatch

Si vous avez besoin de pouvoir traiter les jours ainsi que les heures, les minutes et les secondes, vous pourriez faire quelque chose comme ceci :

countdown() {
    start="$(( $(date +%s) + $1))"
    while [ "$start" -ge $(date +%s) ]; do
        ## Est-ce plus de 24h ?
        days="$(($(($(( $start - $(date +%s) )) * 1 )) / 86400))"
        time="$(( $start - `date +%s` ))"
        printf '%s jour(s) et %s\r' "$days" "$(date -u -d "@$time" +%H:%M:%S)"
        sleep 0.1
    done
}

stopwatch() {
    start=$(date +%s)
    while true; do
        days="$(($(( $(date +%s) - $start )) / 86400))"
        time="$(( $(date +%s) - $start ))"
        printf '%s jour(s) et %s\r' "$days" "$(date -u -d "@$time" +%H:%M:%S)"
        sleep 0.1
    done
}

Notez que la fonction stopwatch n'a pas été testée pour les jours car je ne voulais vraiment pas attendre 24 heures pour cela. Cela devrait fonctionner, mais veuillez me le faire savoir si ce n'est pas le cas.

10 votes

J'ai ajouté ces jolies fonctions à mon .zshrc juste après avoir lu votre réponse. Aujourd'hui, j'ai utilisé countdown pour la première fois et j'ai remarqué une utilisation assez élevée du processeur. J'ai ajouté un sleep 0.1 (je ne sais pas si un temps de sommeil d'une fraction de seconde est pris en charge sur tous les systèmes), ce qui a grandement amélioré la situation. L'inconvénient est bien sûr une précision d'affichage moins précise, mais je peux vivre avec une déviation de max. 100ms.

0 votes

@mpy merci d'avoir mentionné cela. J'obtiens une utilisation du CPU d'environ 3% lorsque je fais cela en utilisant bash, je peux vivre avec ça (bien que ce soit plus élevé que ce que je m'attendais et j'ai également ajouté le sleep à mon propre .bashrc).

0 votes

@terdon : Je dois admettre que je l'ai utilisé sur une machine plutôt ancienne (2007 ? !) et le processeur est monté jusqu'à 18%... sinon je ne l'aurais probablement pas remarqué.

130voto

Nir Alfasi Points 1578

Ma façon préférée est :

Démarrer :

time cat

Arrêter :

ctrl+c

Comme l'a commenté @wjandrea ci-dessous, une autre version consiste à exécuter :

time read

et appuyez sur Enter pour arrêter

14 votes

Similaire, mais vous pouvez appuyer sur Entrée pour l'arrêter: temps de lecture

16 votes

time read échoue dans zsh, mais time (read) fonctionne.

3 votes

Le problème, cependant, est que vous ne pouvez pas voir le temps sans l'annuler ou le terminer. Lorsque vous le redémarrez, le chronomètre recommence à zéro.

68voto

trehn Points 771

J'ai cherché la même chose et j'ai fini par écrire quelque chose de plus élaboré en Python:

Cela vous donnera un simple compte à rebours de 10 secondes:

sudo pip install termdown
termdown 10

Source: https://github.com/trehn/termdown

0 votes

Ne fonctionne pas avec python 3.x

3 votes

@Suhaib: Il devrait et le fait pour moi. Veuillez soulever un problème sur GitHub avec plus d'informations.

1 votes

A besoin d'un paquet brew

29voto

efk Points 369

Utilisez leave (cela fonctionne au moins sur les descendants de BSD) :

man leave

Configurer une alarme pour 15 minutes :

leave +0015
Alarme réglée pour Thu Nov  3 14:19:31 CDT 2016. (pid 94317)

2 votes

Laisser fonctionne également sous Linux, mais d'abord vous devez installer le programme leave à partir des dépôts par défaut.

4 votes

Laisser fait le travail sur mac et produit un son de bip

1 votes

C'est bien, sauf que actuellement il ne prend pas en compte les secondes, il n'est donc pas possible de faire un compte à rebours de 30 secondes, par exemple.

13voto

Adobe Points 2331

J'ai utilisé celui-ci :

countdown()
(
  IFS=:
  set -- $*
  secs=$(( ${1#0} * 3600 + ${2#0} * 60 + ${3#0} ))
  while [ $secs -gt 0 ]
  do
    sleep 1 &
    printf "\r%02d:%02d:%02d" $((secs/3600)) $(( (secs/60)%60)) $((secs%60))
    secs=$(( $secs - 1 ))
    wait
  done
  echo
)

Exemple :

 countdown "00:07:55"

Voici une source.

3 votes

POSIX conforme - fonctionne sur OS X :)

0 votes

Erreur sur arch linux: compte à rebours:4: mauvaise expression mathématique: opérande attendu à `* 60 +'

0 votes

@Chalist pourriez-vous utilisez Zsh. Fonctionne bien sur Bash

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X