15.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 15.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 15.11. Calcul de Date

#!/bin/bash
# date-calc.sh
# Auteur : Nathan Coulter
# Utilisé avec sa permission dans le guide ABS (merci !).

MPHR=60    # Minutes par heure.
HPD=24     # Heures par jour.

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


ACTUEL=$(date -u -d '2007-09-01 17:30:24' '+%F %T.%N %Z')
CIBLE=$(date -u -d'2007-12-25 12:30:00' '+%F %T.%N %Z')
# %F = date complète, %T = %H:%M:%S, %N = nanosecondes, %Z = fuseau horaire.

printf '\nEn 2007, %s ' \
       "$(date -d"$ACTUEL +
        $(( $(diff) /$MPHR /$MPHR /$HPD / 2 )) jours" '+%d %B')" 
#       %B = nom du mois                  ^ à moitié
printf 'était entre %s ' "$(date -d"$ACTUEL" '+%d %B')"
printf 'et %s\n' "$(date -d"$CIBLE" '+%d %B')"

printf '\nSur %s à %s, ils étaient \n' \
        $(date -u -d"$ACTUEL" +%F) $(date -u -d"$ACTUEL" +%T)
DAYS=$(( $(diff) / $MPHR / $MPHR / $HPD ))
CURRENT=$(date -d"$ACTUEL +$DAYS days" '+%F %T.%N %Z')
HOURS=$(( $(diff) / $MPHR / $MPHR ))
CURRENT=$(date -d"$ACTUEL +$HOURS hours" '+%F %T.%N %Z')
MINUTES=$(( $(diff) / $MPHR ))
CURRENT=$(date -d"$ACTUEL +$MINUTES minutes" '+%F %T.%N %Z')
printf '%s jours, %s heures, ' "$DAYS" "$HOURS"
printf '%s minutes et %s secondes ' "$MINUTES" "$(diff)"
printf "jusqu'au repas de Noel!\n\n"

#  Exercice :
#  ---------
#  Ré-écrire la fonction diff() pour accepter des paramètres passés,
#+ plutôt que d'utiliser des variables globales.

La commande date a un certain nombre d'options d'affichage. Par exemple, %N donne la partie nanosecondes de l'heure. Une utilisation intéressante pour ceci est de générer des entiers sur six chiffres au hasard.

date +%N | sed -e 's/000$//' -e 's/^0//'
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Supprime les zéros en début et en fin s'ils existent.

Il existe beaucoup d'autres options (essayez 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')  # Quatre semaines avant (pas un mois).
UneAnneeAvant=$(date --date='1 year ago')

Voir aussi l'Exemple 3.4, « Sauvegarde de tous les fichiers modifiés dans les dernières 24 heures ».

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 très détaillées sur le temps d'exécution d'une commande.

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

0.00user 0.01system 0:00.05elapsed 16%CPU (0avgtext+0avgdata 0maxresident)k
 0inputs+0outputs (149major+27minor)pagefaults 0swaps

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. Elle attend durant le nombre spécifié de secondes, ne faisant rien. Elle peut être utile pour un timing ou dans les processus tournant en tâche de fond, en attente d'un évenement spécifique vérifié par intervalle, tel que dans l'Exemple 29.6, « Nettoyage après un Control-C ».

sleep 3
# Attend 3 secondes.
[Note]

Note

La commande sleep se base par défaut sur les 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.