Comment utiliser $ SECONDS dans un script bash?

Je souhaite enregistrer le résultat de la commande $SECONDS dans une variable, pour imprimer l’heure au format HH:MM:SS .

C’est ce que j’ai essayé jusqu’à présent. J’ai essayé de l’imprimer de différentes manières et le résultat était toujours 0 :

 time_spent="$SECONDS" echo "Time: $time_spent" 

Je veux imprimer le temps passé dans la shell lorsque je ferme ma console. J’ai créé un script qui s’exécute à chaque fermeture de la console.

Pour obtenir $SECONDS au format HH: MM: SS, vous devrez faire quelques calculs (entiers):

 hrs=$(( SECONDS/3600 )); mins=$(( (SECONDS-hrs*3600)/60)); secs=$(( SECONDS-hrs*3600-mins*60 )) printf 'Time spent: %02d:%02d:%02d\n' $hrs $mins $secs Time spent: 431:48:03 

Vous avez référencé la variable interne bash SECONDS (qui affiche le nombre de secondes écastings depuis l’appel de l’instance actuelle du shell) et enregistré la valeur sous la forme d’une autre variable time_spent . Maintenant, chaque fois que vous vérifiez la valeur de la variable time_spent , vous obtenez la même valeur, celle qui a été sauvegardée au moment de l’extension de SECONDS .

Pour obtenir dynamicment SECONDS , vous devez référencer directement $SECONDS plutôt que d’utiliser une variable intermédiaire:

 echo "Time: $SECONDS" 

Si vous insistez pour utiliser une variable intermédiaire, assurez-vous de développer chaque fois $SECONDS .


En ce qui concerne la valeur 0 de SECONDS , vous pouvez facilement reproduire ceci:

 % bash -c 'echo $SECONDS' 0 

Le fait est que: lorsque vous calculez la valeur, ce n’est pas encore une seconde, donc la valeur est 0 , correctement.

En voici un rapide qui donne des heures, minutes et secondes depuis l’ouverture du shell:

 ~$ cat how_long_open #!/bin/bash time=$SECONDS printf '%dh:%dm:%ds\n' $(($time/3600)) $(($time%3600/60)) $(($time%60)) 

Étant donné que les scripts s’exécutent dans un sous-shell, le meilleur moyen d’obtenir une sortie est de le générer au lieu de l’appeler.

Exemples:

Sans rechercher le script

 ~$ ./how_long_open 0h:0m:0s 

Avec sourcing le script

 ~$ source ./how_long_open 1h:24m:40s 

J’espère que cela t’aides!

Si vous êtes sûr que $SECONDS sera inférieur à 1 jour (soit 86400 secondes), la date GNU core-utils effectue assez bien le formatage requirejs:

 $ date -ud "@$SECONDS" "+Time elapsed: %H:%M:%S" Time elapsed: 00:32:05 $