Je sais que des utilitaires bien comportés comme grep envoient des messages "normaux" à stdout et des messages d'erreur à stderr.
$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory
Lorsque j'écris moi-même des scripts shell, j'ai souvent du mal à décider quelle sortie et quels messages je dois présenter sur stderr, ou si je devrais m'embêter du tout.
J'aimerais connaître les bonnes pratiques: quand rediriger un message vers stderr est-il nécessaire et raisonnable, et quand non?
"Cela dépend", bien sûr, mais avez-vous des idées qui pourraient m'aider à prendre ces décisions?
Afin d'adapter cette question subjective au format, je voudrais encourager des réponses qui répondent au "pourquoi", et qui sont éclairées par l'expérience et si possible appuyées par des faits.
Réponses:
Le silence est d'or. Rien de sortie si tout va bien.
La façon la plus simple de séparer stderr de stdout: imaginez simplement que toutes les sorties de vos scripts seront redirigées vers une autre commande via pipe. Dans ce cas, vous devez conserver toutes les notifications dans stderr, car de telles informations inattendues dans stdout peuvent interrompre la séquence de canaux.
Parfois aussi dans des tuyaux comme celui-ci:
vous devez transmettre quelque chose
command2
à la sortie des utilisateurs. Le moyen le plus simple sans fichiers temporaires est stderr.la source
echo
certaines variables, montrer ce qui a été fait, montrer la progression). J'hésite à tout mettre sur stderr car ces messages de journalisation sont tous les scripts qui sortiront jamais. Je ne sais pas comment appliquer l'idée de tuyau dans ces situations.J'écris généralement tout ce qui concerne le fonctionnement de l'application
stderr
,stdout
est réservé aux données.Imaginez une application comme
cat
. Lorsque vous l'utilisez pour lire l'entrée et la transmettre à une autre application (via un canal), vous ne voulez pas que la sortie soit jonchée de messages d'état.Tout ce qui pourrait être intéressant pour une autre application ou un post-processeur pour mon application va
stdout
, tout ce qui ne concerne que l'interne de mon application va l'êtrestderr
.la source
Ma préférence personnelle est d'envoyer des messages d'erreur et des exceptions à
stderr
et des messages d'information àstdout
. OMI,stderr
est pour toutes les exceptions et donc, ma convention.la source