16.3. Commandes de date et d'heure

L'heure/date et le chronométrage

date

Exécutée telle quelle, date affiche la date et l'heure sur stdout. Cette commande devient intéressante grâce à ses options de présentation et d'analyse.

Exemple 16.10. Utiliser date

#!/bin/bash
# S'exercer avec la commande 'date'

echo "Le nombre de jours écoulés depuis le début de l'année `date +%j`."
# On a besoin d'un '+' au début pour demander un formatage correct.
# %j donne le jour de l'année.

echo "Le nombre de secondes écoulées depuis 01/01/1970 est `date +%s`."
#  %s affiche le nombre de secondes écoulées depuis le début de l'époque UNIX,
#+ mais quelle est son utilité ?

prefixe=temp
suffixe=$(date +%s)  # L'option "+%s" de 'date' est spécifique à GNU.
nomfichier=$prefixe.$suffixe
echo $nomfichier
#  C'est intéressant pour créer des noms de fichiers temporaires "uniques",
#+ voire mieux que d'utiliser $$.

#  Voir la page de manuel de 'date' pour plus d'informations sur ses
#+ possibilités de présentation.

exit 0

L'option -u renvoie la date au format UTC (Temps Universel Coordonné).

bash$ date
Fri Mar 29 21:07:39 MST 2002



bash$ date -u
Sat Mar 30 04:07:42 UTC 2002
              

Cette option facilite le calcul du temps entre des dates différentes.

Exemple 16.11. Calcul de Date

#!/bin/bash
# date-calc.sh
# Author: Nathan Coulter
# Used in ABS Guide with permission (thanks!).

MPHR=60    # Minutes per hour.
HPD=24     # Hours per day.

diff () {
        printf '%s' $(( $(date -u -d"$TARGET" +%s) -
                        $(date -u -d"$CURRENT" +%s)))
#                       %d = day of month.
}


CURRENT=$(date -u -d '2007-09-01 17:30:24' '+%F %T.%N %Z')
TARGET=$(date -u -d'2007-12-25 12:30:00' '+%F %T.%N %Z')
# %F = full date, %T = %H:%M:%S, %N = nanoseconds, %Z = time zone.

printf '\nIn 2007, %s ' \
       "$(date -d"$CURRENT +
        $(( $(diff) /$MPHR /$MPHR /$HPD / 2 )) days" '+%d %B')" 
#       %B = name of month                ^ halfway
printf 'was halfway between %s ' "$(date -d"$CURRENT" '+%d %B')"
printf 'and %s\n' "$(date -d"$TARGET" '+%d %B')"

printf '\nOn %s at %s, there were\n' \
        $(date -u -d"$CURRENT" +%F) $(date -u -d"$CURRENT" +%T)
DAYS=$(( $(diff) / $MPHR / $MPHR / $HPD ))
CURRENT=$(date -d"$CURRENT +$DAYS days" '+%F %T.%N %Z')
HOURS=$(( $(diff) / $MPHR / $MPHR ))
CURRENT=$(date -d"$CURRENT +$HOURS hours" '+%F %T.%N %Z')
MINUTES=$(( $(diff) / $MPHR ))
CURRENT=$(date -d"$CURRENT +$MINUTES minutes" '+%F %T.%N %Z')
printf '%s days, %s hours, ' "$DAYS" "$HOURS"
printf '%s minutes, and %s seconds ' "$MINUTES" "$(diff)"
printf 'until Christmas Dinner!\n\n'

#  Exercise:
#  --------
#  Rewrite the diff () function to accept passed parameters,
#+ rather than using global variables.

La commande date a un certain nombre d'options d'affichage. Par exemple, %N donne la partie nanosecondes de l'heure. Cette option peut notamment servir au tirage aléatoire d'entiers de six chiffres.

date +%N | sed -e 's/000$//' -e 's/^0//'
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#  Supprime les zéros éventuels, au début et à la fin.
#  La longueur de l'entier généré dépend du nombre de zéros qui ont
#+ été supprimés.

# 115281032
# 63408725
# 394504284

D'autres options existent (faites man date).

date +%j
# Affiche le numéro du jour dans l'année (nombre de jours écoulés depuis le 1er janvier).

date +%k%M
#  Affiche l'heure et les minutes dans un format sur 24 heures, en une chaîne
#+ composée d'un seul nombre.



# Le paramètre 'TZ' permet la surcharge du fuseau horaire par défaut.
date                 # Mon Mar 28 21:42:16 MST 2005
TZ=EST date          # Mon Mar 28 23:42:16 EST 2005
# Merci à Frank Kannemann et Pete Sjoberg pour l'astuce.


SixJoursAvant=$(date --date='6 days ago')
UnMoisAvant=$(date --date='1 month ago')  
                     # Il y 4 semaines (pas un mois !)
UneAnAvant=$(date --date='1 year ago')

Voir aussi l'Exemple 3.4, « Sauvegarde de tous les fichiers modifiés depuis 24 heures » et Exemple A.43, « Chronomètre en ligne de commande » .

zdump

Affichage de fuseau horaire : Affiche la date dans le fuseau horaire spécifié.

bash$ zdump EST
EST  Mar Sep 18 22:09:22 2001 EST
              
time

Renvoie des statistiques détaillées sur le temps d'exécution d'une commande.

time ls -l / va donner quelque chose d'équivalent à ceci :

real    0m0.067s
 user    0m0.004s
 sys     0m0.005s

Voir aussi la commande similaire times de la section précédente.

[Note]

Note

À partir de la version 2.0 de Bash, time est devenu un mot réservé du shell, avec un comportement très légèrement différent dans un tube.

touch

Utilitaire de mise à jour de la date d'accès/modification d'un fichier à partir de la date système courante ou d'une date spécifiée mais aussi utile pour créer un nouveau fichier. La commande touch zzz créera un nouveau fichier zzz de taille nulle, en admettant bien entendu que zzz n'existait pas auparavant. Marquer de cette façon des fichiers vides est utile pour stocker la date, par exemple pour garder trace des modifications de date sur un projet.

[Note]

Note

La commande touch est équivalent à : >> nouveaufichier ou >> nouveaufichier (pour des fichiers ordinaires).

[Astuce]

Astuce

Avant de faire un cp -u (copy/update), utilisez touch pour mettre à jour le marquage horaire des fichiers que vous ne voulez pas écraser.

Comme exemple, si le répertoire /home/bozo/tax_audit contient les fichiers spreadsheet-051606.data, spreadsheet-051706.data et spreadsheet-051806.data, alors exécuter un touch spreadsheet*.data protégera ces fichiers d'un écrasement par des fichiers de même nom durant un cp -u /home/bozo/financial_info/spreadsheet*data /home/bozo/tax_audit.

at

La commande de contrôle de job at exécute une liste de commandes données à l'heure souhaitée. À première vue, at ressemble à cron. Cependant, at sert surtout à exécuter d'un coup une liste de commandes.

at 2pm January 15 demande une liste de commandes à exécuter à cette heure précise. Ces commandes devraient être compatibles avec un script shell car, en pratique , l'utilisateur écrit un script shell exécutable une ligne à la fois. L'entrée se termine avec un Ctrl-D.

En utilisant le paramètre -f ou la redirection d'entrée (<), at lit une liste de commandes depuis un fichier. Ce fichier est un script shell exécutable, bien qu'il devrait être non-interactif. Il est particulièrement malin d'inclure la commande run-parts dans le fichier pour exécuter un différent jeu de scripts.

bash$ at 2:30 am Friday < at-jobs.liste
job 2 at 2000-10-27 02:30
              
batch

La commande de contrôle de job batch est similaire à at, mais elle exécute une liste de commande quand la charge système tombe en dessous de .8. Comme at, elle peut lire les commandes depuis un fichier avec le paramètre -f.

cal

Affiche un calendrier mensuel correctement formaté vers stdout. cal affichera l'année en cours ou bien un large intervalle d'années passées et futures.

sleep

C'est l'équivalent shell d'une boucle d'attente. On attend sans rien faire pendant le nombre indiqué de secondes. Cette commande est utile par exemple pour une mesure de temps ou dans les processus tournant en tâche de fond, en attente d'un évenement spécifique vérifié de temps en temps, tel que dans l'Exemple 32.6, « Nettoyage après un Control-C ».

sleep 3  
# Ne fait rien pendant 3 secondes.
[Note]

Note

La commande sleep se base par défaut sur des secondes, mais des minutes, des heures ou des jours peuvent aussi être spécifiés.

sleep 3 h
# Attend 3 heures !
[Note]

Note

La commande watch pourrait être un meilleur choix que sleep pour lancer des commandes à des intervalles réguliers.

usleep

Microsleep (le u peut être lu de la même manière que la lettre Grecque mu ou micro). Elle fonctionne de manière identique à sleep, décrit juste au dessus, sauf qu'elle « attend » à partir de délai en micro-secondes. On peut l'utiliser pour des chronométrages très fins ou pour interroger un processus en cours à des intervalles très fréquents.

usleep 30
# Attend 30 micro-secondes.

Cette commande fait partie du paquetage Red Hat initscripts / rc-scripts.

[Attention]

Attention

La commande usleep ne permet pas des chronométrages particulièrement précis et n'est donc pas adaptée pour des boucles aux temps critiques.

hwclock, clock

La commande hwclock accède à ou ajuste l'horloge de la machine. Quelques options requièrent les privilèges du super-utilisateur (root). Le fichier de démarrage /etc/rc.d/rc.sysinit utilise hwclock pour ajuster l'heure système depuis l'horloge machine durant le démarrage.

La commande clock est un synonyme de hwclock.