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.
Table des matières
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 :
stdin
: ce qui donné au shell (via clavier, la plupart du temps)stdout
: ce qu’affiche le shell (ex : le résultat de la commande ls)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).