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.

MiNdFrEaK
la source
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
stackoverflow.com/questions/3840558/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Utilisez Linux cmd de base time yourprogram.sh:, que @Marius Cotofana a expliqué
Martijn van Wezel

Réponses:

29

Si vous voulez la durée en secondes, en haut utilisez

start=$SECONDS

et à la fin

duration=$(( SECONDS - start ))
glenn jackman
la source
Et si cela prend plus de quelques secondes?
Pithikos
@Pithikos Voir la réponse de Philip Gibbons ci
xhienne
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
Marius Cotofana
la source
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
Philip Gibbons
la source
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}'
anask
la source
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.

Alex Galindo
la source