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.