2009-09-16 16 views
21

Sto creando uno script che gestisce un set predefinito di dati, che viene esportato in un file. Voglio far apparire un avvertimento quando un dato (che è sempre "normale" in ogni set a cui ho avuto accesso) è diverso affermando che questo valore non è gestito (poiché non so come influisce sui dati). Dovrei inviare questo avviso a stderr o stdout?Devo emettere avvisi su STDERR o STDOUT?

risposta

27

Se ho salvato l'output di questo script (vale a dire solo stdout) in modo che possa essere elaborato in un secondo momento, tale avviso interferirebbe con il modo in cui l'output viene analizzato? Inoltre, se l'output è collegato a un altro processo, l'avviso dovrebbe apparire sul terminale, quindi l'utente lo vedrà immediatamente.

Per questi motivi, in generale, si generano avvisi su stderr.

1

La vera domanda è: se qualcuno dovesse reindirizzare l'output del tuo script in un file, vorresti che l'avviso fosse inserito nel file o diretto all'utente?

Se si prevede che l'utente intraprenda un'azione a seguito dell'avviso, dovrebbe passare a STDERR. Se è probabile che uno script downstream venga attivato dall'avviso, dovrebbe passare a STDERR.

+0

Quindi dovrebbe andare a stderr a prescindere? O intendevi che uno dei due riferimenti a STDERR fosse STDOUT? –

+0

Intendevo STDERR su entrambi. Sono due casi in cui devi praticamente inviarlo a stderr. L'unica volta che riesco a pensare di volerlo andare in stdout è se l'output dello script è per il consumo umano (forse manderai l'output a qualcuno per dargli un'occhiata), e potresti desiderare di seguire gli avvertimenti l'output senza dover ricordare di reindirizzare lo stderr. – Martin

4

L'avviso dovrebbe andare a stderr.

Oltre ai punti presentati da altri (che causano errori di analisi per i processi downstream e che nascondono l'errore dall'utente alla console), c'è un problema di flessibilità.

Se l'utente non desidera che l'avviso di stderr passi a un processo downstream che sta analizzando lo stdout, non deve fare nulla di speciale.

your_script | downstream_process 

Se l'utente vuole l'avvertimento da stderr di andare in un processo a valle che analizzare stdout e stderr, l'utente può utilizzare 2> & 1 per reindirizzare stderr in stdout.

your_script 2>&1 | downstream_process 

Se voi di uscita sia le avvertenze e le eventuali dati normali a stdout, l'utente non ha buon modo di separare gli avvertimenti dei dati senza l'analisi di tutto. Quindi inviare gli avvertimenti a stderr dà allo script anche maggiore flessibilità.

Problemi correlati