invio dell'output a / dev / stderr vs.> & 2


11

Negli script, gli errori vengono generalmente inviati al descrittore di file 2 con &2, ovvero:

echo "error" >&2

A volte /dev/stderrviene utilizzato invece:

echo "error" > /dev/stderr 

Guardando /dev/stderr, vedo che è solo un collegamento simbolico a /proc/self/fd/2, che a sua volta è un collegamento simbolico a /dev/pts/5(sul mio terminale corrente).

Sembra un po 'complicato. C'è qualche logica dietro questo?

Sta usando /dev/stderre &2equivalente?

Qualcuno di quelli è preferito rispetto all'altro?


3
echo "error" >2crea un file con nome 2e contenuto error.
Ciro,


Vedo la mia modifica reintrodotta e 2 invece di 2. La tua domanda è effettivamente sull'uso di >2, o >&2?
Jeff Schaller

Risposte:


13

Il dispositivo speciale /dev/stderrè specifico del sistema, mentre il descrittore di file 2(non il dispositivo speciale /proc/self/fd/2) è portatile. Se vuoi scrivere un codice non portatile, quei dispositivi speciali sono un buon punto di partenza.

Esistono alcuni sistemi con /dev/stderr: Linux, ovviamente, e OSX . Ma OSX non ha un /procfilesystem ed /dev/stderrè un collegamento a /dev/fd/2.

Ulteriori letture:


Inoltre c'è il caso in cui qualcuno vuole fare ad es. questo 2> bla.logche funzionerebbe fintanto che si esegue il pipe 2e non il codice /dev/stderr. Fondamentalmente 2non è necessario che sia l' stderroutput.
Larkey,

6

In bash, e altre shell, la strada a qualcosa di reindirizzamento di errore standard è quello di utilizzare >&2. Bash si apre /dev/stderrcome descrittore di file 2 . Ai descrittori di file si fa riferimento da &Ndove si Ntrova il numero del descrittore. Quindi, echo error >&2verrà stampato errorsu errore standard, su /dev/stderr.

Si aprirà anche /dev/stdoutcome descrittore di file 1. Questo significa che puoi farlo echo output >&1. Tuttavia, poiché ogni cosa viene stampata sullo standard output comunque per impostazione predefinita, è uguale a se echo outputstessa.

Ora 2>è diverso. Qui, stai reindirizzando l'output dell'errore di un comando da qualche altra parte. Quindi, 2>filesignifica "reindirizzare qualsiasi cosa stampata sul descrittore di file 2 (errore standard) su file".


3

Hai ragione, >&2è più diretto e perfettamente "idiomatico". Dovrebbero essere equivalenti, quindi non c'è un motivo particolare da usare >/dev/stderr. Solo che, se qualcuno che legge non sa cosa fanno, uno di questi è probabilmente più facile da scoprire dell'altro :-). Ma in generale ti suggerisco di usare >&2.

/ dev / stderr potrebbe essere utile quando i programmi scriveranno errori su un nome file specificato, ma non supportano stderr. Chiaramente questo è un po 'inventato; / dev / stdout è molto più utile. (Recentemente ho scoperto che lo mysql_safescript wrapper non scriverà errori sulla console; sfortunatamente vuole anche cambiare le autorizzazioni sul file di registro degli errori, quindi l'uso di / dev / stderr provoca alcuni avvisi superflui).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.