Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 04/05/2026, à 22:14

fnux

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Bonjour pingouinux.

pingouinux a écrit :

Bonjour fnux,
Apparemment, la variable SECONDS n'est pas définie en shell. Essaye d'exécuter ton script en bash.

Il y avant bien longtemps que je ne t'avais pas embêté avec mes questojns stupides ! wink

Mais merci de m"avoir une nouvelle fois remit sur la bonne route. smile

En effet, je ne sais pas pourquoi j'ai utilisé "#!/bin/sh" en entête de ce script alors que d'habitude j'utilise "#!/bin/bash". Où avais-je la tête ? roll

Et maintenant que c'est corrigé, comme par miracle, le script "test_time2.sh" fonctionne parfaitement comme prévu. cool

#!/bin/bash
echo ""
echo "---------------------------- Start the script ---------------------------"
echo "Please wait, I'm working..."
work_date1=$(date)
work_start=$SECONDS
sleep 79                 # this is to simulate the execution time of your script
work_date2=$(date)
work_stop=$SECONDS
work_hour=$(((($work_stop-$work_start))/3600))
work_minutes=$((((($work_stop-$work_start))%3600)/60))
work_secondes=$((((($work_stop-$work_start))%3600)%60))
#
# Remove or comment the line 7 above and place the command to calculate the 
# execution time here which can be any system command or executable file.
#
echo ""
echo "Script start time  : "$work_date1
echo "Script stop time   : "$work_date2
echo ""
echo "Script elapsed time: "$work_hour"h "$work_minutes"m $work_secondes""s"
echo ""
echo "I'm done!"
echo ""
echo "BTW, thank you to pigouinux from the ubuntu.fr forum."
echo ""
echo "----------------------------- End of the script -------------------------"
exit 200

Encore merci, et merci aussi à tous ceux qui ont participé.

Je mets donc [résolu] au titre de ce thread.

Cheers.


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately

Hors ligne

#27 Le 04/05/2026, à 22:29

Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

il faut encore nettoyer toutes les parenthèses inutiles : elles ne sont indisppensables qu'autour de l'addition/soustraction pour lui donner la priorité sur la multiplication/division/modulo.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#28 Le 04/05/2026, à 23:19

fnux

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Bonsoir Watael,

Watael a écrit :

il faut encore nettoyer toutes les parenthèses inutiles : elles ne sont indisppensables qu'autour de l'addition/soustraction pour lui donner la priorité sur la multiplication/division/modulo.

Merci du conseil, je vais expérimenter ça en relisant ce qui a été publié précédemment, mais je ne suis pas doué ! tongue

Bonne soirée.


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately

Hors ligne

#29 Le 04/05/2026, à 23:33

fnux

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Re bonsoir watael,

Watael a écrit :

il faut encore nettoyer toutes les parenthèses inutiles : elles ne sont indisppensables qu'autour de l'addition/soustraction pour lui donner la priorité sur la multiplication/division/modulo.

En effet, ça fonctionne aussi bien comme suit :

#!/bin/bash
echo ""
echo "---------------------------- Start the script ---------------------------"
echo "Please wait, I'm working..."
work_date1=$(date)
work_start=$SECONDS
sleep 79                 # this is to simulate the execution time of your script
work_date2=$(date)
work_stop=$SECONDS
work_hour=$(( (work_stop-work_start) / 3600))
work_minutes=$(( (work_stop-work_start) %3600 / 60))
work_secondes=$(( (work_stop-work_start) %3600 %60))
#
# Remove or comment the line 7 above and place the command to calculate the 
# execution time here which can be any system command or executable file.
#
echo ""
echo "Script start time  : "$work_date1
echo "Script stop time   : "$work_date2
echo ""
echo "Script elapsed time: "$work_hour"h "$work_minutes"m $work_secondes""s"
echo ""
echo "I'm done!"
echo ""
echo "BTW, Thank you to pigouinux, iznobe & watael from the ubuntu.fr forum."
echo ""
echo "----------------------------- End of the script -------------------------"
exit 200

et c'est plus joli ! tongue

Merci à toutes et tous pour votre aide.

Cheers.


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately

Hors ligne

#30 Le 05/05/2026, à 00:19

Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

au #10, je montrais qu'il est possible de tout calculer dans une seule Évaluation arithmétique

...
    ((E=arg, j=E/(24*60**2), H=E%(24*60**2), h=H/(60**2), M=H%(60**2), m=M/(60), s=M%60));
...

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#31 Le 05/05/2026, à 01:31

fnux

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Re bonsoir Watael.

Watael a écrit :

au #10, je montrais qu'il est possible de tout calculer dans une seule Évaluation arithmétique

...
    ((E=arg, j=E/(24*60**2), H=E%(24*60**2), h=H/(60**2), M=H%(60**2), m=M/(60), s=M%60));
...

C'est exact, je l'avais aussi vu, mais d'une part c'est nettement moins lisible (et donc maintenable) surtout dans un simple script bash, et d'autre part, je ne suis pas certain ni que ce soit plus rapide, ni que cela consomme moins de ressources.

KISS est l'un de mes mantra.

Cheers.

Dernière modification par fnux (Le 05/05/2026, à 01:39)


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately

Hors ligne

#32 Le 05/05/2026, à 03:25

Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

pour la lisibilité, tu n'es pas obligé d'avoir des variables d'une seule lettre, mais ça permet de n'avoir qu'une ligne

la répétition des Substitutions de commande, ce n'est pas ruineux, mais ça doit coûter quand même un peu smile

quant à la maintenabilité, cette partie ne devrait pas changer d'ici à... ce que le Temps change. lol

visiblement le KISS évolue avec l'apprentissage : un jour tu en auras peut-être assez de passer de ligne en ligne pour un résultat.
je voulais surtout que tu saches ce qu'il est possible de faire.

Dernière modification par Watael (Le 05/05/2026, à 03:27)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#33 Le 05/05/2026, à 06:38

MicP

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Bonjour

Si on est sûr(e) que le temps d'exécution du script sera inférieur à 24 heures,
on peut utiliser les fonctionnalités de la commande date comme ci-dessous :

work_date1=$(( EPOCHSECONDS - 7200 ))    # l'heure actuelle en secondes (moins deux heures pour ce test)
work_date2=$EPOCHSECONDS                 # l'heure actuelle en secondes
echo ""
echo "Script start time  : $(date -d@$work_date1)"
echo "Script stop time   : $(date -d@$work_date2)"
echo ""
echo "Script elapsed time: $(date -ud@$(( work_date2 - work_date1 )) +"%Hh %Mm %Ss")"

Dernière modification par MicP (Le 05/05/2026, à 21:27)

Hors ligne

#34 Le 08/05/2026, à 02:54

fnux

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Bonjour MicP

Merci de ta contribution.

MicP a écrit :

Bonjour

Si on est sûr(e) que le temps d'exécution du script sera inférieur à 24 heures,
on peut utiliser les fonctionnalités de la commande date comme ci-dessous :

work_date1=$(( EPOCHSECONDS - 7200 ))    # l'heure actuelle en secondes (moins deux heures pour ce test)
work_date2=$EPOCHSECONDS                 # l'heure actuelle en secondes
echo ""
echo "Script start time  : $(date -d@$work_date1)"
echo "Script stop time   : $(date -d@$work_date2)"
echo ""
echo "Script elapsed time: $(date -ud@$(( work_date2 - work_date1 )) +"%Hh %Mm %Ss")"

Non, pas exactement sur 24 heures, mais c'est aussi une de mes contraintes en regard du changement éventuel de jour après minuit.

Ta solution est aussi très élégante, mais grâce à ton avertissement sur les 24 heures, la seule raison pour laquelle je n'appliquerai pas à priori ta méthode est que le script complet que j'utilise et dont je calcule son "total execution elapsed time" a une durée d'exécution supérieure à 3 heures 15 minutes (multiplle assemblages et compilations entre-coupés de téléchargements) et, comme il peut être lancé à n'importe quelle heure de la journée, il peut donc déborder sur 2 jours calendaires s'il est lancé après 22 heures (à moins que je n'aies pas compris comment fonctionne ta solution car, pour être honnête, je n'ai vraiment pas eu le temps de l'essayer en fin de journée pour voir comment elle se comporte.).

C'est en particulier pour cela que j'utilise la fonction "date" à plusieurs endroits critiques de mon script pour afficher la date et l'heure du début et de fin de chaque phase de l'exécution du script, ce qui montre alors la succession des tâches qui s’enchaînent bien sans interruption et que je récupère dans un fichier "trace.txt" pour contrôle éventuel en cas d'erreur.

Pour conclure, la solution que j'ai retenue dans ma dernière version de test que j'ai publiée avant répond donc parfaitement à mon besoin spécifique.

Merci quand même.


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately

Hors ligne

#35 Le 08/05/2026, à 04:05

Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

les calculs de dates s'effectuent en secondes depuis EPOCH · <-point

tu prends date +%s* au début, que tu soustrais à date +s* à la fin, et tu auras le nombre de secondes écoulées entre le début et la fin du script
ou tu affiches SECONDS à la fin du script; ça c'est KISS!

quoi qu'il en soit, si tu veux quelque chose de lisible pour un humain, il faut calculer sec2jhms

--
* ou EPOCHSECONDS en bash


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#36 Le 08/05/2026, à 07:15

MicP

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Bonjour

Voir plus bas, car ici, j'avais fait une erreur : le jour d'une date n'est jamais à zéro. roll

L'heure de départ n'a aucune importance avec cette méthode, et si la durée d'exécution de ton script devait prendre plus de 24 heures,
il suffirait juste de changer le format d'affichage de la dernière commande comme ceci :

echo "Script elapsed time: $(date -ud@$(( work_date2 - work_date1 )) +"%dd %Hh %Mm %Ss")"

Avec cette méthode et ce format d'affichage, la durée maximale d'exécution de ton script ne devra pas dépasser 31 jours 23 heures 59 minutes et 59 secondes :
(2678399 est le nombre de secondes qu'il y a dans 31 jours 23 heures 59 minutes et 59 secondes)

mic@deb134:~$ work_date1=$((EPOCHSECONDS-2678399)); work_date2=$EPOCHSECONDS
mic@deb134:~$ echo "Script elapsed time: $(date -ud@$(( work_date2 - work_date1 )) +"%dd %Hh %Mm %Ss")"
Script elapsed time: 31d 23h 59m 59s
mic@deb134:~$ 

Dans les lignes de commandes ci-dessus, la commande date n'est utilisée que pour formater le nombre de secondes en jours, heures, minutes et secondes,
et du coup, ça évite d'avoir à faire tous ces calculs de conversion dans le script.

Dernière modification par MicP (Le 08/05/2026, à 08:49)

Hors ligne

#37 Le 08/05/2026, à 07:35

Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

heu.. fais d'aures tests.

j'ai l'impression de voir un facochère se frotter sur un potamochère...
c'est pire, en fait; beurk !

lol

Dernière modification par Watael (Le 08/05/2026, à 07:39)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#38 Le 08/05/2026, à 07:38

MicP

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Bonjour Watael

Effectivement, si je les mets work_date1 et work_date2 à la même valeur, la durée affichée est de 1 jour.
Je cherche...

OK, c'est qu'il n'y a pas de date dont le jour pourrait être à zéro, et donc c'est à 1 au lieu de zéro
Il faudrait donc enlever un jour au nombre de jours calculés.

Cordialement.

Dernière modification par MicP (Le 08/05/2026, à 07:53)

Hors ligne

#39 Le 08/05/2026, à 07:40

Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

moi aussi. wink


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#40 Le 08/05/2026, à 07:42

Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

SECONDS and that's it.
sinon, KISS!
svp.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#41 Le 08/05/2026, à 09:28

MicP

Re : [résolu] Perdu à cause d'une erreur de maths en bash !

Il fallait juste que je prenne en compte que le jour zéro n'est pas une date => ça commence par le chiffre 1
Donc, il me fallait enlever 1 au nombre de jours, ce que je fais ci-dessous :

mic@deb134:~$ work_date1=$((SECONDS-2678399)); work_date2=$SECONDS
mic@deb134:~$ dt=( $(date -ud@$((work_date2-work_date1)) +"%d %H %M %S") )
mic@deb134:~$ echo "Script elapsed time: $((${dt[0]}-1))d ${dt[1]}h ${dt[2]}m ${dt[3]}s"
Script elapsed time: 30d 23h 59m 59s
mic@deb134:~$ 

Dernière modification par MicP (Le 08/05/2026, à 09:56)

Hors ligne