Ich weiß, dass gut erzogene Dienstprogramme wie grep "normale" Nachrichten an stdout und Fehlermeldungen an stderr ausgeben.
$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory
Wenn ich selbst Shell-Skripte schreibe, fällt es mir oft schwer zu entscheiden, welche Ausgabe und welche Nachrichten ich auf stderr präsentieren soll oder ob ich mich überhaupt darum kümmern soll.
Ich würde gerne etwas über bewährte Praktiken erfahren: Wann ist die Weiterleitung einer Nachricht an stderr erforderlich und sinnvoll, und wann nicht?
"Es kommt darauf an", klar, aber haben Sie einige Einsichten, die mir helfen würden, diese Entscheidungen zu treffen?
Um diese subjektive Frage auf das Format abzustimmen, möchte ich zu Antworten ermutigen, die das "Warum" ansprechen und durch Erfahrung und wenn möglich durch Fakten untermauert sind.
Antworten:
Schweigen ist Gold. Gib nichts aus, wenn alles in Ordnung ist.
Die einfachste Möglichkeit, stderr von stdout zu trennen: Stellen Sie sich vor, alle Ihre Skriptausgaben werden über eine Pipe an einen anderen Befehl umgeleitet. In diesem Fall sollten Sie alle Benachrichtigungen in stderr aufbewahren, da solche unerwarteten Informationen in stdout die Pipe-Sequenz unterbrechen können.
Auch manchmal in Pfeifen wie dieser:
Sie müssen etwas
command2
an die Benutzerausgabe übergeben. Der einfachste Weg ohne temporäre Dateien ist stderr.quelle
echo
einige Variablen, zeigen, was getan wurde, zeigen den Fortschritt). Ich zögere, alles auf stderr zu setzen, da diese Protokollmeldungen alles sind, was das Skript jemals ausgeben wird. Ich bin nicht sicher, wie ich die Pipe-Idee in diesen Situationen anwenden soll.Ich schreibe in der Regel alles, was mit dem Anwendungsbetrieb zu tun hat
stderr
,stdout
ist für Daten reserviert.Stellen Sie sich eine Anwendung wie
cat
. Wenn Sie die Eingabe lesen und über eine Pipe an eine andere Anwendung übergeben, möchten Sie nicht, dass die Ausgabe mit Statusmeldungen übersät wird.Alles, was für eine andere Bewerbung oder einen Postprozessor für meine Bewerbung interessant sein könnte, wird für
stdout
alles verwendet, was sich nur auf die Interna meiner Bewerbung beziehtstderr
.quelle
Ich persönlich bevorzuge es, Fehlermeldungen und Ausnahmen
stderr
sowie Informationsnachrichten an zu sendenstdout
. IMO,stderr
ist für alle Ausnahmen und damit meine Konvention.quelle