Léa-Linux & amis :   LinuxFR   GCU-Squad   Zarb.Org   GNU
un chronomètre en shell script
Envoyé par: |/|BaH

Bonjour à tous

Quelqu'un a-t-il déjà rédiger un script pour faire fonctionner un chronomètre dans une console (pas un compte à rebours (quoique l'idée puisse être séduisante d'en faire un compte en avant pour indiquer le temps passé depuis le début de l'éxécution)?
Je pensais innocemment qu'il suffisait de
#!/bin/bash
#
#ProG de script pour un chronomètre
#le but du "jeu" : afficher le temps écouler depuis le lancement du script
#
heureExe=""
heureExe=$(date +%T)
#
while : ;do
clear
heureCourante=$(date +%T)
chrono=$heureCourante-$heureExe
echo $chrono
sleep 1
done
#
pour que ça fonctionne, mais que dalle! J'obtiens un affichage de ce type : 12:10:32-12:09:21.
(Il) m'est d'avis qu'on ne peut effectuer d'opération sur ce format de date.

Alors, comment faire?

Poste le Tuesday 12 February 2008 12:38:28
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: tellmewhy

Bonsoir |/|BaH , :-)

Citation

mais que dalle! J'obtiens un affichage de ce type : 12:10:32-12:09:21.

C'est normal.

Un exemple :
:~$ a=4;b=2;echo $a $b
4 2
:~$ c=$a-$b;echo $c
4-2

:~$ let c=$a-$b;echo $c
2

Pour la commande let tu en apprendras plus ici :
Commandes internes et intégrées

Tu en apprendras bien plus encore sur le Bash ici :

Guide avancé d'écriture des scripts Bash par Mendel Cooper
Le Shell par Frédéric Lang (au format pdf)
Le shell ou le retour du C:\> ! (et les commandes) par Jean-Christophe, Marc et Anne

Pour ton problème, une idée, pour pouvoir faire une soustraction correcte,
tu devrais convertir tes dates en secondes depuis 1970, puis faire la soustraction.

date +%s

Puis pour convertir les secondes en unité de ton choix, pense à ton ami Google.



Poste le Wednesday 13 February 2008 05:50:33
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

Ta-Da !!!
#!/bin/bash

# Script pour un chronomètre
# affiche le temps écouler depuis le lancement du script
#

HD=$(date +%s)
## Cette partie est peut-être retors, mais je ne m'imagine pas convertir des secondes en sexagésimal
SC=$(date +%S)	#	#	#	# afiche les secondes en cours
tpfx=60	#	#	#	#	# 60
let csc=$tpfx-$SC	#	#	# calcul les secondes en cours jusqu'à 60 secondes

while : ;do
clear
HC=$(date +%s)
let chronoH=($HC-$HD)/3600 # affiche des heures
let chronoM=($HC-$HD)/60   # affiche des minutes
SC2=$(date +%S --date +"$csc"seconds)	# affiche les secondes en cours avec un décalage de sdoif secondes
echo -n -e '\E[1;37;46m'"$chronoH $chronoM $SC2 " 
sleep 1 #.5 on peut régler le rafraîchissement
tput sgr0 # restauration des paramètres d'affichage par défaut
done
C'est peut-être pas très élégant mais ça marche depuis 0 9 58

Un seul inconvénient auquel je n'ai pas (encore) trop réfléchi, est que j'ai mis de la couleur, mais étant donné que je sors par Ctrl-c le 'tput sgr0' n'est pas "intercepté"...

Poste le Wednesday 13 February 2008 12:08:18
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: tellmewhy

Bonjour |/|BaH, :-)

Citation

Un seul inconvénient auquel je n'ai pas (encore) trop réfléchi, est que j'ai mis de la couleur, mais étant donné que je sors par Ctrl-c le 'tput sgr0' n'est pas "intercepté"

Le mot magique c'est clear, juste après tput sgr0.
Sur le sujet :
Coloriser des scripts

Une mine d'or (le trésor de cep):http://www.cepcasa.info/divers/




Poste le Wednesday 13 February 2008 15:24:41
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

hon hon!

Citation
NBaH
étant donné que je sors par Ctrl-c le 'tput sgr0' n'est pas "intercepté"...
C'est par pur un coup de bol que je tape Ctrl-c juste au moment de la boucle infinie qui est sur 'tput sgr0'! Enfin, maintenant, c'est 'tput init; clear'

Par contre j'ai inséré un 'tput cup 11 36' qui place le compteur (on peut pas vraiment appeler ça un chronomètre) au milieu de l'écran (c'est très drôle!^_^!).



Poste le Wednesday 13 February 2008 16:29:37
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: oudoubah

Citation
|/|BaH
Un seul inconvénient auquel je n'ai pas (encore)
trop réfléchi, est que j'ai mis de la couleur,
mais étant donné que je sors par Ctrl-c le 'tput
sgr0' n'est pas "intercepté"...

Pour trapper ce signal, tu peux utiliser la commande trap en tout début de script.
Lors d'un ctrl-c, tu peux attraper le signal pour exécuter une fonction juste avant de rendre la main ;-)

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Wednesday 13 February 2008 16:59:59
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: tellmewhy

Bonjour |/|BaH, bonjour oudoubah, ;-)

Ça m'apprendra à lire en diagonale, j'avais sauté le Ctrl + C.
Honte à moi, honte à moi. :-(. :-)) ;-)

Poste le Wednesday 13 February 2008 17:39:43
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: twocats

Un conseil, mets tes couleurs en variables, ça simplifie grandement la rédaction :
# COULEURS
COLOROFF="\033[1;0m"    # standart color
GREENCOLOR="\033[1;32m"  # green
WHITECOLOR="\033[1;37m"  # white
BLUECOLOR="\033[1;36m"   # blue
DARKBLUECOLOR="\033[1;34m"   # darkblue
REDCOLOR="\033[1;31m" # red
LILACOLOR="\033[1;35m" # lilac
YELLOWCOLOR="\033[1;33m" # yellow

-------------------
La réponse est 42

Poste le Wednesday 13 February 2008 22:13:47
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

Bonjour à tous

Citation
tellmewhy
Ça m'apprendra à lire en diagonale
Pour ma part je croyais que trap servait à empêcher ctrl-c de fonctionner. (Il peut servir à ça aussi)

trap 'tput init; clear' [sigspec]
...n'attrape rien. C'est bien ainsi que ça s'écrit ?

J'y ai cru, mais c'était un de ces coups de bol.

J'ai essayé les 64 sigspec, en lettres, en chiffres...rien!
[^]non, en fait j'ai juste essayé SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGTERM SIGSTOP ^^[/^]
Je l'ai mis au début du script, dans la boucle...rien!

Par contre je fais des progrès, je chope de plus en plus le moment du rafraîchissement.

Bof bof, j'ai ajouté '\E[0m' après ma ligne d'echo, qui me rend une console propre, mais j'aurai bien aimé avoir un rafraîchissement de l'écran à l'interruption du script...

Poste le Thursday 14 February 2008 11:58:45
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: oudoubah

Essaie par exemple :

trap byebye QUIT TERM

byebye() {
   echo "Ce n'est qu'un au revoir mon frère,..."
}

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 14 February 2008 12:03:17
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

sans plus d'effet

Poste le Thursday 14 February 2008 13:05:55
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

Si vous trouvez que vous avez 5 mn de libre, pourriez-vous me confirmer que vos 'trap' fonctionnent (ou pas) chez vous avec ce script.

J'ai ajouté
trap sortie QUIT TERM

sortie(){
kill -s TERM
}

[...]
au début du script sans gain aucun.

Quelque chose dans le script pourrait-il empêcher trap de faire son boulot ?...

Dans tous les cas, je vous remercie de votre patiente attention et pour votre aide.

Poste le Friday 15 February 2008 21:24:38
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: Fanch

j'écrirais plutôt un truc du genre :
sortie() {
...
}
trap 'sortie' 2

pour que sortie soit définit au moment de l'appel à trap et attention que le nom de la fonction est entre apostrophes.

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Sunday 17 February 2008 21:22:47
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

Ce 'trap' m'agace à en sembler davantage un chausse-trappe...

Cette boucle est-elle ainsi mal faite, que je ne puisse la défaire, et ce malgré que j'en aie, que par un Ctrl-C violent, déniant_ainsi à l'écran d'ajouter de sa fraîcheur d'antan?

(?)

Poste le Monday 18 February 2008 23:54:40
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: Fanch

s/défnit/définie/

si j'écris le script suivant :
#!/usr/bin/env bash

sortie() {
        echo "au dodo ..."
        exit 0
}

trap 'sortie' 2

while : ; do
        echo "je fais un truc"
        sleep 2s
done

ça m'écrit "je fais un truc" jusqu'à ce que je fasse ctrl+c et là ça m'écrit "au dodo" puis ça se termine.

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Tuesday 19 February 2008 08:33:33
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

Tu sais que c'est encore pire quand j'insère 'trap' dans ce script?

Parce que sans 'trap', Ctrl-C interrompt le script. Alors qu'avec, Ctrl-C est totalement inopérant, et le script ne s'arrête pas, et il faut que je tue la console.

C'est flippant! Tout ce que je trouve sur le 'net confirme ce que vous me dites tous, et de mon côté j'ai mon compteur qui tourne. Il sautille un peu quand j'appuie sur Ctrl-C. Point. Il tourne...

Que devrais-je voir en tapant 'trap -p' dans une console? Est-il normal que rien apparaisse?

Poste le Tuesday 19 February 2008 11:42:47
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: Fanch

si ta fonction appelée par trap n'est pas sortante (ie, elle fait un exit), alors c'est pas lui qui va arrêter le script.
Donc, en gros, tu fais une fonction sortie qui fait les bon tput, qui remet tout d'aplomb puis qui fait un exit 0 et là ça marche.


------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Tuesday 19 February 2008 12:55:40
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

Il faut laisser les touches Ctrl-C appuyées jusqu'à ce que la combinaison soit intercepté par 'trap' ?

Si non rien n'est résolu; si oui, alors c'était un problème mécanique (le doigt qui ne reste pas assez longtemps sur le clavier)

Poste le Tuesday 19 February 2008 13:37:15
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: Fanch

vu ce que fait ton script, et sauf erreur de ma part, cela doit être instantané

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Tuesday 19 February 2008 20:18:59
Répondre     Citer    
Re: un chronomètre en shell script
Envoyé par: |/|BaH

Donc, on recommence :

Citation
NBaH
A l'aide !!!

ou j'ouvre un nouveau sujet : le problème n'est plus l'écriture d'un "chronomètre"...


J'ouvre un nouveau sujet : *"utilisation de 'trap'"

Merci pour votre patience, et à bientôt sur le nouveau sujet*

Poste le Tuesday 19 February 2008 21:19:14
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
un chronomètre en shell script
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Serveur hébergé par ST-Hebergement et Lost-Oasis / IRC hébergé par FreeNode / NS secondaire hébergé par XName
Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons