Comment utiliser une minuterie en bash?


30

J'avais besoin d'une minuterie qui commencera au tout début du script et s'arrêtera à la fin.


2
s'il vous plaît, écrivez un objectif que vous souhaitez atteindre. pour mesurer la timecommande d' utilisation du temps de travail du script (time ./script.sh), pour imprimer la datecommande d' utilisation du temps actuel , etc.
précipiter


Utilisez Linux cmd de base time yourprogram.sh:, que @Marius Cotofana a expliqué
Martijn van Wezel

Réponses:



23

Vous pouvez utiliser la timecommande intégrée de Linux . Depuis la page de manuel:

COMMANDE de temps [arguments]

time détermine les informations à afficher sur les ressources utilisées par la commande à partir de la chaîne FORMAT. Si aucun format n'est spécifié sur la ligne de commande, mais que la variable d'environnement TIME est définie, sa valeur est utilisée comme format.

Pour chronométrer le cleanup.shscript, utilisez:

$ time cleanup.sh

1
Sachez que timevous utilisez. hackernoon.com/…
km6zla

8

Je me rends compte que c'est une question assez ancienne, mais c'est la façon dont je le fais pour n'importe quoi quand je veux / besoin de savoir combien de temps quelque chose a pris pour fonctionner.

Bash a un compteur de secondes intégré sous la forme d'une variable interne nommée SECONDS(voir: ici pour d'autres variables internes)

Mettez SECONDS=0avant tout ce que vous vérifiez le temps d'exécution. Il doit être après toute entrée utilisateur pour obtenir un bon résultat, donc si vous demandez des informations, mettez-le 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 pour:

echo "Completed in $SECONDS seconds"

Par exemple:

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

3
Un raccourci pour ceux qui ne veulent pas d'une mise en forme de l'heure aussi élaborée: date +%T -d "1/1 + $SECONDS sec"(limité à moins de 24h, mais vous pouvez aussi l'adapter pour ajouter des jours)
xhienne

1
#!/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}'

1
Salut, bienvenue sur l'Unix SE! Les réponses uniquement en code ne semblent pas très bien, peut-être pourriez-vous expliquer ce que fait votre script.
Peterh dit réintégrer Monica

0

@anask fait une solution intelligente pour cette réponse, je recommande simplement d'utiliser le natif à la $SECONDSplace 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 de la printfdivision est de convertir les secondes écoulées en heures, minutes, secondes correspondantes, respectivement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.