J'écris un script en bash pour calculer le temps écoulé pour l'exécution de mes commandes, considérez:
STARTTIME=$(date +%s)
#command block that takes time to complete...
#........
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."
Je suppose que ma logique est correcte, mais je me retrouve avec l'impression suivante:
"Cela prend quelques secondes pour terminer cette tâche ..."
Quelque chose ne va pas avec mon évaluation de chaîne?
Je crois que les variables bash ne sont pas typées, j'aimerais quand même s'il existe une méthode "string to integer" dans bash.
Je trouve très propre d'utiliser la variable interne "$ SECONDS"
SECONDS=0 ; sleep 10 ; echo $SECONDS
la source
$SECONDS
fonctionne effectivement pour / bin / bash. Cela ne fonctionne pas pour le / bin / dash, le shell par défaut dans Debian et Ubuntu.sleep 0.5
ci-dessus, le résultat est parfois 0, parfois 1 (au moins par Bash 5.0.3).Vous essayez d'exécuter le numéro dans le
ENDTIME
sous forme de commande. Vous devriez également voir une erreur comme1370306857: command not found
. Utilisez plutôt le développement arithmétique :Vous pouvez également enregistrer les commandes dans un script séparé
commands.sh
et utiliser la commande time:la source
Vous pouvez utiliser le
time
mot - clé de Bash ici avec une chaîne de format appropriéeVoici ce que dit
TIMEFORMAT
la référence :la source
Pour des nombres plus grands, nous souhaitons peut-être imprimer dans un format plus lisible. L'exemple ci-dessous fait la même chose que les autres mais s'imprime également au format "humain":
Test simple:
Production:
A utiliser dans un script comme décrit dans d'autres articles (capturez le point de départ puis appelez la fonction avec l'heure de fin:
la source
Essayez le code suivant:
la source
Ceci est une alternative à la fonction de Mike Q:
la source
SECONDS
la réponse de Lon Kaut et garder à l'esprit que $ / $ {} n'est pas nécessaire sur les variables arithmétiques rend le code si court qu'il pourrait même être utilisé en ligne:echo "$((SECONDS/3600))h $(((SECONDS/60)%60))m $((SECONDS%60))s"
essayez d'utiliser le temps avec l'option secondes écoulées:
/usr/bin/time -f%e sleep 1
sous bash.ou
\time -f%e sleep 1
en bash interactif.voir la page de manuel time:
et
la source
/bin/time
ne fonctionnera pas ici: OP mentionne un bloc . Nous avons donc vraiment besoin du mot-clétime
ici.la source
la source