Javais besoin dun minuteur qui commencera au tout début du script et sarrêtera à la fin.
Commentaires
Réponse
Si vous voulez la durée en secondes, utilisez en haut
start=$SECONDS
et à la fin
duration=$(( SECONDS - start ))
Commentaires
- Et si cela prend plus de secondes?
- @Pithikos Voir Réponse de Philip Gibbons ' ci-dessous
Réponse
Vous pouvez utiliser la commande time
intégrée à Linux. Depuis la page de manuel:
time COMMAND [arguments]
time détermine les informations à afficher ay à propos des ressources utilisées par la COMMANDE à partir de la chaîne FORMAT. Si aucun format nest spécifié sur la ligne de commande, mais que la variable denvironnement TIME est définie, sa valeur est utilisée comme format.
Pour chronométrer le cleanup.sh
script, utilisez:
$ time cleanup.sh
Commentaires
- Savoir le
time
que vous utilisez. hackernoon.com/…
Réponse
Je me rends compte que cest une question assez ancienne, mais cest comme ça que je le fais pour tout quand je veux / ai besoin de savoir combien de temps il a fallu quelque chose pour sexécuter.
Bash a un compteur de secondes intégré sous la forme dune variable interne nommée SECONDS
(voir: ici pour les autres variables internes)
Mettez SECONDS=0
avant tout ce dont vous « vérifiez le temps dexécution. Il doit être après toute entrée utilisateur pour obtenir un bon résultat donc si vous « demandez des informations, placez-les après les invites.
Ensuite, mettez ceci à la fin de ce que vous » vérifiez:
if (( $SECONDS > 3600 )) ; then let "hours=SECONDS/3600" let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" elif (( $SECONDS > 60 )) ; then let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $minutes minute(s) and $seconds second(s)" else echo "Completed in $SECONDS seconds" fi
Si vous voulez seulement connaître le temps en secondes, vous pouvez simplifier ce qui précède en:
echo "Completed in $SECONDS seconds"
À titre dexemple:
read -rp "What"s your name? " "name" SECONDS=0 echo "Hello, $name" if (( $SECONDS > 3600 )) ; then let "hours=SECONDS/3600" let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" elif (( $SECONDS > 60 )) ; then let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $minutes minute(s) and $seconds second(s)" else echo "Completed in $SECONDS seconds" fi
Commentaires
- Un raccourci pour ceux qui ne Je souhaite un formatage de lheure aussi élaboré:
date +%T -d "1/1 + $SECONDS sec"
(limité à moins de 24h, mais vous pouvez également vous adapter pour ajouter des jours) - Excellent lien vers les variables internes de TLDP ' . Merci pour cela!
Réponse
#!/bin/bash start=$(date +%s) # # do something sleep 10 # # end=$(date +%s) seconds=$(echo "$end - $start" | bc) echo $seconds" sec" echo "Formatted:" awk -v t=$seconds "BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}"
Commentaires
- Bonjour, bienvenue sur Unix SE! Les réponses au code uniquement don ' t semblent très bien, peut-être pourriez-vous expliquer ce que fait votre script.
- Pourquoi multipliez-vous par 1000 ici, puis divisez par 1000 * modificateur plus tard pour toutes les valeurs affichées?
Réponse
@anask fait une solution intelligente pour cela réponse, je recommande simplement dutiliser le $SECONDS
natif à la place pour en créer un nouveau
awk -v t=$SECONDS "BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}"
Le but du printf
et la division consiste à convertir les secondes écoulées en lunité correspondante Heures, Mins, Secs, respectivement.
Réponse
Jai récemment tenté quelque chose de similaire. Je suggérerais:
date1=$(date +%s) #Use this arithmetic to determine elapsed time since defining date1 $(( $(date +%s) - $date1 )) #While loop using timer while ! [ $(( $(date +%s) - $date1 )) -gt 10 ]; do #Terminal timer -n won"t append new line, so the echo will replace itself. ##There is also some date formatting to achieve: HH:MM:SS. echo -ne "$(date -u --date @$(( $(date +%s) - $date1 )) +%H:%M:%S)\r" done
time
(time ./script.sh), pour imprimer lheure actuelle, utilisez la commandedate
et ainsi de suite.time yourprogram.sh
, que @Marius Cotofana a expliqué