Sé que las utilidades con buen comportamiento como grep generan mensajes "normales" a stdout y mensajes de error a stderr.
$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory
Cuando escribo scripts de shell, a menudo me resulta difícil decidir qué salida y qué mensajes debo presentar en stderr, o si debo molestarme.
Me gustaría saber acerca de las buenas prácticas: ¿cuándo es razonable y razonable enviar un mensaje a stderr y cuándo no?
"Depende", claro, pero ¿tiene alguna idea que me ayudaría a tomar estas decisiones?
Para que esta pregunta subjetiva se ajuste al formato, me gustaría alentar respuestas que aborden el "por qué", y que estén informadas por la experiencia y, si es posible, respaldadas por hechos.
Respuestas:
El silencio es oro. No genera nada si todo está bien.
La forma más fácil de separar stderr de stdout: solo imagine que toda la salida de sus scripts será redirigida a otro comando a través de pipe. En ese caso, debe mantener todas las notificaciones en stderr, ya que dicha información inesperada en stdout puede romper la secuencia de la tubería.
También a veces en tuberías como esta:
necesita pasar algo de la
command2
salida de los usuarios. La forma más fácil sin archivos temporales es stderr.fuente
echo
algunas variables, mostrar lo que se ha hecho, mostrar el progreso). Dudo en poner todo en stderr ya que estos mensajes de registro son todo lo que el script generará. No estoy seguro de cómo aplicar la idea de tubería en estas situaciones.Generalmente escribo todo lo relacionado con la operación de la aplicación
stderr
,stdout
está reservado para datos.Imagina una aplicación como
cat
. Cuando lo usa para leer la entrada y pasarla a otra aplicación (a través de una tubería), no desea que la salida esté llena de mensajes de estado.Todo lo que pueda ser interesante para otra aplicación o un postprocesador para mi aplicación
stdout
, todo lo que solo se relaciona con el interno de mi aplicación lo harástderr
.fuente
Mi preferencia personal es enviar mensajes de error y excepciones
stderr
y mensajes informativos astdout
. OMI,stderr
es para cualquier excepción y, por lo tanto, mi convención.fuente