Reindirizza sia stderr che stdout su / dev / null con / bin / sh


61

Ho provato tutti i tipi di modi per reindirizzare sia stdoute stderrper /dev/nullsenza alcun successo. Ho quasi corso tutta la mia vita bash con cui non ho mai avuto questo problema, ma per una volta in BSD sono bloccato /bin/sh.

Cosa ho provato:

if ls ./python* 2> /dev/null; then
    echo found Python
fi

... che funziona; se Python non è presente, silenzia i messaggi di errore da ls. Tuttavia, se python.tgzpresente, viene emessa una linea che assomiglia a questa:

# ./test.sh
./python-2.7.3p1.tgz

Ho provato:

if ls ./python* &> /dev/null; then
    echo found Python
fi

e

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

e

if ls ./python* > /dev/null; then
    echo found Python
fi

Niente funziona davvero. Posso solo reindirizzare una delle uscite, non entrambe contemporaneamente.

Risposte:


102

Funzionerà con qualsiasi shell compatibile con Posix:

ls good bad >/dev/null 2>&1

Bisogna reindirizzare stdout prima prima della duplicazione in stderr ; se lo duplichi per primo, stderr indicherà solo ciò che stdout ha inizialmente indicato.

Bash , zsh e alcune altre shell forniscono anche il collegamento

ls good bad &>/dev/null

che è conveniente da riga di comando ma dovrebbe essere evitato negli script che sono destinati a essere portatili.


1
In effetti, ho letto il manuale della shell bourn. Ha affermato che le versioni successive di /bin/shhanno implementato la &>/dev/nullsintassi, in altre parole non è così o ho una versione precedente (che non posso fare eco in alcun modo, eseguendo OpenBSD 5.3 quindi dovrebbe essere sufficiente)
Torxed

8
@Torxed, OpenBSD shsi basa su pdksh. Non c'è più la shell Bourne al giorno d'oggi. cshintrodotto >&anche disponibile in zsh. bashha scelto &>(ora supportato anche da zshe alcuni pdkshderivati) anche se rompe chiaramente la conformità POSIX poiché foo &> fileè una sintassi POSIX perfettamente valida che significa qualcosa di completamente diverso.
Stéphane Chazelas,

3
@ StéphaneChazelas (...) che significa qualcosa di completamente diverso Mi hai lasciato chiedendomi cosa significa in questo caso ... :)
Piotr Dobrogost

4
@PiotrDobrogost, foo &> fileè come foo & > fileo foo & : > file, che viene eseguito in background e apre il file per la scrittura senza alcun comando (è improbabile che venga utilizzato in questo modo).
Stéphane Chazelas,

5
@PiotrDobrogost, >&non è l'ideale sia come è in conflitto con i >&2, >&-operatori. zshaggiunto per comodità per gli utenti di csh (csh non ha >&2). Sono solo zucchero sintattico, basta usare quello > file 2>&1che è standard e portatile (alle conchiglie tipo Bourne).
Stéphane Chazelas,
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.