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