Rediriger les messages d’un script dans des fichiers log

Si vous écrivez un script qui n’a pas pour objectif de tourner dans un terminal (un service par exemple, ou un script Nautilus), peut-être voudrez-vous quand même obtenir les résultats dudit script, ne serait-ce que pour le debuggage.

Créer un unique fichier log

Supposons que vous vouliez obtenir un fichier log qui récupère tous les messages affichés dans le terminal. Pour cela, placez au début de votre script la commande suivante :

exec &> Sortie.log

À chaque fois que le script sera lancé, le fichier log sera écrasé. Si vous voulez « empiler » les résultats, remplacez la redirection« > » par « >> ».

Explications

Unix (et ses descendants) gère les entrées et sorties comme des fichiers. Celles-ci sont par défaut :

  1. stdin : ce qui donné au shell (via clavier, la plupart du temps)
  2. stdout : ce qu’affiche le shell (ex : le résultat de la commande ls)
  3. stderr : le message d’erreur, le cas échéant

Le fait de différentier messages d’erreur et flux sortant permet de les traiter différemment (stderr interrompt un script, pas stdout).

Les « fichiers associés » à ces flux s’appellent sobrement « 1 », « 2 » et « 3 » (dans le même ordre). On parle de descripteurs de fichiers (parfois abrégés FD pour File Descriptors). L’esperluette (« & ») dans ma commande précédente est en fait un raccourci pour les FD 1 et 2.

Séparer stdin et stderr

Si vous avec bien suivi, alors vous aurez compris qu’il est possible de traiter différemment sdtout et stderr, ce qui permet de rapidement mettre en évidence le plantage d’un script.

Exemple :

exec 1>Sortie.log
exec 2>Crash.log

Exemple un peu plus complet :

#!/bin/bash
LOG_FILE=Sortie.log
ERR_FILE=Erreurs.log
 
exec 1>$LOG_FILE
exec 2>$ERR_FILE
ls -hal		# Sortie 'normale' -> STDOUT
apt-get update	# Erreur de droits -> STDERR

Pour aller plus loin

La gestion des flux est relativement complexe, c’est pourquoi je suis resté sobre sur les explications, de peur de dire un peu trop de conneries d’imprécisions. Donc si vous vous découvrez une passion pour les entrées/sortie sous Unix, je vous conseille la lecture de cette page (ou de sa traduction, disponible ici).