Realizzare un “conto alla rovescia” da terminale

countdown

Mi è capitato in questi giorni di necessitare di un contatore alla rovescia (o countdown in gergo) da utilizzare in un evento per dare il tempo ai relatori che si susseguivano nei loro interventi. Sembra strano ma quando si organizza un evento si pensa sempre a tutto ma poi, inevitabilmente, ci si dimentica di qualcosa… e quel qualcosa risulta sempre importante!

Come fare? O si trovava una applicazione ad hoc oppure… oppure si può usare un semplice script e un terminale. Tempo di realizzazione 2 minuti al massimo!

Non ci credete? Continuate a leggere allora.

Innanzi tutto occorre generare uno script che simula un contatore alla rovescia. Lo si può fare in molti modi; io l’ho fatto così:

$ cat bin/clock.sh
#!/bin/bash

NAME=$(basename $0)

if [ $# -lt 2 ] ; then
    echo “usage: $NAME <min> <sec>” >&2
    exit 1
fi
min=$1
sec=$2

while sleep 1; do
    printf “%02d : %02dn” $min $sec

    if [ $sec -eq 0 -a $min -le 0 ] ; then
        break;
    fi

    sec=$(($sec – 1))
    if [ $sec = “-1” ] ; then
        sec=59
        min=$(($min – 1))
    fi
done

echo ‘Fine!!!’

exit 0

La struttura è semplice e di facile comprensione e se lo si può provare lanciando il comando:

$ clock.sh 1 1
01 : 01
01 : 00
00 : 59
00 : 58
00 : 57
00 : 56

00 : 03
00 : 02
00 : 01
00 : 00
Fine!!!

I più attenti di voi potranno obiettare che inevitabilmente, per alti valori di tempo, il contatore diventerà meno preciso… vero, ma i tempi sono trascurabili per le esigenze che avevo e in 2 minuti mi par di aver già fatto un buon lavoro. :-)

A questo punto però c’è il problema di ingrandire i caratteri del contatore perché, altrimenti, per i relatori potrebbe diventare difficoltoso leggere il tempo rimasto loro mentre stanno parlando.

Una prima soluzione potrebbe essere quella di ingrandire al massimo i caratteri del terminale (con Ubuntu è abbastanza facile farlo), ma anche così le stampe del tempo che passa risultano sempre piccole. Si può ricorrere allora a figlet, un tool che letta una stringa via stdin (o sulla command line) la riproduce su stdout con caratteri più grandi realizzati con l’ASCII-art. Ecco un esempio:

$ figlet -f big 10 : 30
 __  ___        ____   ___ 
/_ |/ _    _  |___ / _
 | | | | | (_)   __) | | | |
 | | | | |      |__ <| | | |
 | | |_| |  _   ___) | |_| |
 |_|___/  (_) |____/ ___/
                           

L’opzione -f big serve per selezionare i font più grandi del default.

Beh, a questo punto il trucco è svelato: basta usare figlet per stampare il tempo che passa ed ingrandire al massimo i font del terminale ridimensionando quest’ultimo in modo che le varie stampe si “sovrappongano” annullando l’effeto di scroll up tipico del teminale.

Vi riporto uno screenshot del mio terminale e di seguito il listato di clock.sh nella sua forma finale che usa figlet.countdown

$ cat bin/clock.sh
#!/bin/bash

NAME=$(basename $0)

if [ $# -lt 2 ] ; then
    echo “usage: $NAME <min> <sec>” >&2
    exit 1
fi
min=$1
sec=$2

while sleep 1; do
    printf “%02d : %02dn” $min $sec | figlet -f big

    if [ $sec -eq 0 -a $min -le 0 ] ; then
        break;
    fi

    sec=$(($sec – 1))
    if [ $sec = “-1” ] ; then
        sec=59
        min=$(($min – 1))
    fi
done

echo ‘Fine!!!’ | figlet -f big

exit 0

Su Rodolfo Giometti

Ingegnere informatico libero professionista ed esperto GNU/Linux offre supporto per: - device drivers; - sistemi embedded; - sviluppo applicazioni industriali per controllo automatico e monitoraggio remoto; - corsi di formazione dedicati. Manutentore del progetto LinuxPPS (il sottosistema Pulse Per Second di Linux) contribuisce attivamente allo sviluppo del kernel Linux con diverse patch riguardanti varie applicazioni del kernel e dispositivi (switch, fisici di rete, RTC, USB, I2C, network, ecc.). Nei 15+ anni di esperienza su Linux ha lavorato con le piattaforme x86, ARM, MIPS & PowerPC.

Lascia un commento

Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi