Si vous écrivez un script qui n’a pas pour objectif de tourner dans un terminal ; 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 :
À 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 :
Exemple un peu plus complet :
Pour aller plus loin
La gestion des flux est relativement complexe, c’est pourquoi je suis resté sobre sur les explications. 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).