2009-05-13 9 views

Répondre

16

Voulez-vous placer ce code dans votre script, ou le faire depuis le processus qui démarre le script? Pour ce dernier, vous pouvez utiliser le mot réservé "time", puis analyser ce qu'il retourne pour obtenir combien de temps prend un script. Si vous voulez faire cela à partir d'un script, vous pouvez mettre la variable SECONDS à zéro, et chaque fois par la suite que vous faites référence à cette variable, il sera mis à jour pour être le nombre de secondes écoulées. Donc, vous pouvez mettre "SECONDS = 0" au tout début de votre script, et chaque fois que vous avez besoin du temps écoulé, il sera dans la variable SECONDS.

Vous pouvez également utiliser la SECONDS $ trick sur la ligne de commande ainsi, par exemple:

$ SECONDS=0; sleep 5 ; echo "that took approximately $SECONDS seconds" 

Le mot réservé du temps et la variable SECONDES sont toutes deux documentées dans la page de manuel bash.

+4

bash est une source sans fin d'astuce et de surprises – flybywire

7

Cela fonctionne dans Bash, et aussi zsh:

# Set time format to seconds 
TIMEFORMAT=%R 
# Time a process 
PROC_TIME=$(time (insert command here >/dev/null 2>&1) 2>&1) 
echo $PROC_TIME 
  • Les deux premiers redirections cachent la sortie de votre processus ">/dev/null 2> & 1"
  • La dernière redirection est nécessaire parce que "time" imprime l'heure sur stderr
+0

'rtime() {TIMEFORMAT =% R; echo $ (time ("$ 1" 2> & 1) 2> & 1)} '.... et plus tard ...' echo $ SECONDS' - C'est la magie ™ ... _et je l'utilise ** TOUS ** le temps_. –

-1

Utilisez la commande heure. Notez que la version de l'heure de bash n'est pas la même que/usr/bin/time. Donc, vous auriez quelque chose comme:

TIME=`/usr/bin/time --format="%e" your_command_here >/dev/null` 

Le format tire juste la valeur temps « réel » out. Vous auriez besoin de convertir cela à partir d'une chaîne si vous vouliez faire autre chose que de l'afficher.

Si vous voulez simplement exporter la chaîne, utilisez export.

+0

La variable '$ TIME' est actuellement utilisée par'/usr/bin/time', il vaudrait donc mieux choisir un nom de variable différent. Une façon d'éviter de telles collisions est de ne pas utiliser de noms en majuscules pour vos propres variables. –

0

En utilisant GNU time,

\time -p -o time.log $COMMAND 

puis lire time.log.

(Utilisez soit \time ou command time, sinon vous allez utiliser intégré dans Bash time, qui ne supporte pas ces options.)

Cela fonctionne même lorsque $COMMAND tirages à stderr (qui confondre Oli de réponse), et conserve stdout/stderr (ce que la réponse de Farzy ne fait pas).

-o ... dit time d'envoyer sa sortie à un fichier plutôt que de stderr (comme la valeur par défaut), et -p génère la

traditionnelle
real 0.00 
user 0.00 
sys 0.00 

plutôt que par défaut de temps GNU de

0.00user 0.00system 0:00.01elapsed 8%CPU (0avgtext+0avgdata 0maxresident)k 
80inputs+0outputs (1major+188minor)pagefaults 0swaps 
Questions connexes