2009-09-16 8 views
21

Estoy haciendo una secuencia de comandos que maneja un conjunto predefinido de datos, la salida a un archivo. Quiero mostrar una advertencia cuando un dato (que siempre es "Regular" en cada conjunto al que he tenido acceso) es diferente, indicando que este valor no se ha manejado (ya que no sé cómo afecta a los datos). ¿Debería enviar esta advertencia a stderr o stdout?¿Debo emitir advertencias a STDERR o STDOUT?

Respuesta

27

Si guardé la salida de este script (es decir, solo stdout) para poder procesarlo más tarde, ¿esa advertencia interferiría con la forma en que se analiza el resultado? Además, si la salida se canaliza a otro proceso, la advertencia debería aparecer en el terminal, por lo que el usuario lo ve de inmediato.

Por esos motivos, en general, emite advertencias a stderr.

1

La verdadera pregunta es: si alguien fuera a redirigir la salida de su script a un archivo, ¿le gustaría que la advertencia se coloque en el archivo o se dirija al usuario?

Si espera que el usuario realice alguna acción como resultado de la advertencia, debe dirigirse a STDERR. Si es probable que la advertencia advierta algún script en sentido descendente, debería ir a STDERR.

+0

Entonces, ¿debería ir a stderr independientemente? ¿O pretendía que una de las dos referencias a STDERR fuera STDOUT? –

+0

Quise decir STDERR en ambos. Son dos casos donde prácticamente tiene que enviarlo a stderr. El único momento en el que puedo pensar en querer que termine es cuando el resultado del guión es para consumo humano (quizás va a enviar la salida por correo electrónico a alguien para echarle un vistazo), y es posible que desee que las advertencias sigan la salida sin tener que recordar para redirigir stderr. – Martin

4

La advertencia debe ir a stderr.

Además de los puntos presentados por otros (causando errores de análisis para procesos posteriores y ocultando el error del usuario en la consola), existe un problema de flexibilidad.

Si el usuario no desea que la advertencia de stderr vaya a un proceso descendente que está analizando stdout, no tiene que hacer nada especial.

your_script | downstream_process 

Si el usuario desea que el aviso de stderr para ir a un proceso descendente que se analizará stdout y stderr, el usuario puede utilizar 2> & 1 para redirigir stderr en la salida estándar.

your_script 2>&1 | downstream_process 

, si se imprime ambas advertencias y los datos normales a la salida estándar, el usuario no tiene buena manera de separar las advertencias de los datos sin analizar todo. Por lo tanto, enviar las advertencias a stderr le da a su script más flexibilidad también.

Cuestiones relacionadas