20.3. Applications

Une utilisation intelligente de la redirection d'E/S est l'analyse et le collage de petits bouts de la sortie de commandes (voir l'Exemple 15.7, « Utiliser read avec la redirection de fichier »). Ceci permet de générer des rapports et des fichiers de traces.

Exemple 20.12. Enregistrer des événements

#!/bin/bash
# logevents.sh
# Auteur : Stephane Chazelas.

# Tracer des événements dans un fichier.
#  Vous devez être root pour exécuter ceci (en fait pour avoir le droit d'écrire dans
#+ /var/log).

ROOT_UID=0     # Seuls les utilisateurs ayant l'identifiant $UID 0 ont les
               #+ privilèges de root.
E_NONROOT=67   # Code de sortie si non root.


if [ "$UID" -ne "$ROOT_UID" ]
then
  echo "Vous devez être root pour exécuter ce script."
  exit $E_NONROOT
fi  


FD_DEBUG1=3
FD_DEBUG2=4
FD_DEBUG3=5

# === Décommentez une des deux lignes ci-dessous pour activer le script. ===
# TRACE_EVENEMENTS=1
# TRACE_VARS=1


log()  # Ecrit la date et l'heure dans le fichier de traces.
{
echo "$(date)  $*" >&7  # Ceci *ajoute* la date dans le fichier.
#     ^^^^^^^ Substitution de commande
                           # Voir ci-dessous.
}



case $NIVEAU_TRACES in
 1) exec 3>&2         4> /dev/null 5> /dev/null;;
 2) exec 3>&2         4>&2         5> /dev/null;;
 3) exec 3>&2         4>&2         5>&2;;
 *) exec 3> /dev/null 4> /dev/null 5> /dev/null;;
esac

FD_TRACEVARS=6
if [[ $TRACE_VARS ]]
then exec 6>> /var/log/vars.log
else exec 6> /dev/null               # Bury output.
fi

FD_TRACEEVENEMENTS=7
if [[ $TRACE_EVENEMENTS ]]
then
  # exec 7 >(exec gawk '{print strftime(), $0}' >> /var/log/event.log)
  # La ligne ci-dessus ne fonctionnera pas avec Bash, version 2.04 et ultérieur.
  # Pourquoi ?
  exec 7>> /var/log/event.log        # Ajoute dans "event.log".
  log                                      # Ecrit la date et l'heure.
else exec 7> /dev/null                  # Supprime le sortie.
fi

echo "DEBUG3: début" >&${FD_DEBUG3}

ls -l >&5 2>&4                       # commande1 >&5 2>&4

echo "Done"                                # commande2 

echo "envoi mail" >&${FD_LOGEVENTS}
# Ecrit "envoi mail" sur le descripteur de fichier #7.


exit 0