(6 risposte)
Chiuso 6 anni fa.
Vorrei impedire al mio programma di inviare stdout e stderr a qualsiasi terminale, file o dispositivo. Per questo, ho tre comandi che mi passano per la mente, ma non riesco a distinguere le loro differenze. Potresti per favore spiegarmi il significato di ciascuno di essi per favore.
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
Risposta accettata:
# ./run > /dev/null
Questo reindirizza stdout a /dev/null
, ma non fa nulla con stderr. Dal momento che hai chiesto di reindirizzare da stdout e stderr, questo non fa quello che vuoi.
# ./run > /dev/null 1>&2
Questo reindirizza stdout a /dev/null
, quindi reindirizza nuovamente stdout (1>
) ovunque punti stderr (&2
) che è probabilmente il terminale ed è probabilmente il punto in cui puntava stdout prima di reindirizzarlo. Quindi l'effetto netto qui è (probabilmente) nessun reindirizzamento per stdout e, per quanto riguarda stderr, non ci fai ancora nulla. Quindi anche questo non è quello che vuoi.
# ./run > /dev/null 2>&1
Questo reindirizza stdout a /dev/null
, quindi reindirizza stderr (2>
) verso il punto a cui punta stdout, che è /dev/null
perché è lì che l'hai appena reindirizzato. Questo sembra essere quello che vuoi.
Non riesco a distinguere le loro differenze.
In realtà, dovresti essere in grado di distinguere le differenze abbastanza facilmente. Diciamo ./run
contiene questo:
#!/bin/sh
echo stdout
echo stderr >&2
Quindi i risultati dovrebbero essere i seguenti:
# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
La differenza è evidente!