Parfois, pendant que j'écris du code, je perds la notion du temps et je n'ai pas vraiment d'idée du temps que j'ai passé.

Pour avoir plus d'informations sur cela je peux m'acheter un chronomètre ou noter l'heure du départ dans un carnet. C'est un peu trop manuel et il serait difficile de garder un journal.

Donc pour être proche de mon ordinateur j'ai écrit un script Bash qui va garder un œil sur le temps passé. Dès que je lui dis que je démarre quelque chose il va m'afficher le temps passé dessus et à la fin il va écrire àa dans un fichier journal.

Pour créer ce nouveau script j'utilise mon générateur de scripts bash localScript.

localScript timer

#!/usr/bin/env bash

if [[ -z "$1" ]]; then
        echo "You need to set a project name as the first variable"
        exit 0
fi

PROJECT=$1

FILENAME='time.log'

START_TIME=$SECONDS

Je passe le nom du fichier journal dans lequel je veux écrire et je m'assure que le nom du projet est bien passé quand le commande est lancé.

Le script doit continuer à tourner jusqu'a ce que je l'arrête, et à ce moment la, écrire dans le journal. Pour ce faire j'ai créé une boucle while true:

while true
do
        DURATION=$(( SECONDS - $START_TIME ))
        echo "$DURATION"
        sleep 10
done

Ensuis j'ai ajouté une commande trap pour intercepter l'arrêt du script et écrire dans le journal :

function writeLog()
{
        echo "$PROJECT date: $(date +'%d-%m-%Y') / user: $USER / time:  $DURATION" >> $FILENAME
}

trap writeLog EXIT

En lançant la commande timer "test project" on voit ce qui suit dans le terminal :

timer "test project"
test project time 0
test project time 10
test project time 20

Dès qu'on arrête le script avec un CTRL+C une ligne sera rajouté dans le journal time.log :

test project date: 18-03-2021 / user: dennis / time: 12421

Cela affiche la date, le nom de l'utilisateur et le temps passé sur le projet.

C'est un bon début mais afin de le rendre un peu plus lisible j'ai passé le temps en secondes en string contenant les heures, minutes et secondes avec une fonction :

function secondsToTimeString() 
{
        echo "$(($1/3600))h:$(($1%3600/60))m:$(($1%60))s"
}

Je ne veux pas non plus spammer mon terminal sur pleins de lignes donc j'ai ajouté l'option -ne à mon echo :

echo -ne "$PROJECT time $(secondsToTimeString $DURATION)                \r"

Maintenant ça marche bien et nous pouvons aussi attacher cette commande à d'autres pour garder un œil sur le temps passé. Voici le script en entier :

#!/usr/bin/env bash

if [[ -z "$1" ]]; then
        echo "You need to set a project name as the first variable"
        exit 0
fi

PROJECT=$1

FILENAME='time.log'

START_TIME=$SECONDS

function secondsToTimeString() 
{
        echo "$(($1/3600))h:$(($1%3600/60))m:$(($1%60))s"
}

function writeLog()
{
        echo "$PROJECT date: $(date +'%d-%m-%Y') / user: $USER / time:  $(secondsToTimeString $DURATION) [$DURATION]" >> $FILENAME
}

trap writeLog EXIT

while true
do
        DURATION=$(( SECONDS - $START_TIME ))
        echo -ne "$PROJECT time $(secondsToTimeString $DURATION)                \r"
        sleep 10
done

Si vous lancez le script vous verrez :

 ➜  ~ timer "Writing a blog post about making a timer"
Writing a blog post about making a timer time 0h:12m:30s   

Et le fichier journal :

➜  ~ cat time.log
Writing a blog post about making a timer date: 18-03-2021 / user: dennis / time:  0h:1m:50s [750]

Pour moi cela va générer un fichier de journal time.log dans le dossier dans lequel je me trouve quand je lance la commande. Je trouve ça très pratique car cela me permet d'avoir un journal à la racine de chaque projet sur lequel je travail. Si vous voulez un fichier plus général qui gardera une trace de toutes les commandes timer appelés vous pouvez modifier la variable FILENAME en quelque chose comme /home/username/time.log