Leiten Sie sowohl stderr als auch stdout mit / bin / sh nach / dev / null um

61

Ich habe alle Arten von Möglichkeiten ausprobiert, sowohl umzuleiten stdoutals stderrauch /dev/nullohne Erfolg. Ich habe fast mein ganzes Leben lang Bash laufen lassen, mit dem ich dieses Problem noch nie hatte, aber ausnahmsweise bin ich bei BSD festgefahren /bin/sh.

Was ich versucht habe:

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

... was funktioniert; Wenn Python nicht vorhanden ist, werden die Fehlermeldungen von ls stummgeschaltet. Wenn python.tgzjedoch vorhanden, wird eine Zeile ausgegeben, die wie folgt aussieht:

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

Ich habe es versucht:

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

und

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

und

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

Nichts funktioniert wirklich. Ich kann nur einen der Ausgänge umleiten, nicht beide gleichzeitig.

Torxed
quelle

Antworten:

102

Dies funktioniert in jeder Posix-kompatiblen Shell:

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

Sie müssen stdout zuerst umleiten, bevor Sie es in stderr duplizieren können . Wenn Sie es zuerst duplizieren, zeigt stderr nur auf das, worauf stdout ursprünglich zeigte.

Bash , zsh und einige andere Shells bieten ebenfalls die Abkürzung

ls good bad &>/dev/null

Dies ist praktisch in der Befehlszeile, sollte aber in Skripten vermieden werden, die portabel sein sollen.

rici
quelle
1
In der Tat habe ich das Bourn Shell Handbuch gelesen. Es wurde angegeben, dass spätere Versionen von /bin/shdie &>/dev/nullSyntax implementiert haben , anscheinend nicht oder ich habe eine ältere Version (die ich in keiner Weise wiedergeben kann und OpenBSD 5.3
ausführt, obwohl
8
@Torxed, OpenBSD shbasiert auf pdksh. Es gibt heutzutage keine Bourne-Shell mehr. csheingeführt >&auch erhältlich in zsh. bashwählte &>(jetzt auch von zshund einigen pdkshDerivaten unterstützt), obwohl es eindeutig die POSIX-Konformität bricht, da foo &> filees sich um eine vollkommen gültige POSIX-Syntax handelt, die etwas völlig anderes bedeutet.
Stéphane Chazelas
3
@ StéphaneChazelas (...) was etwas völlig anderes bedeutet Du hast mich gefragt, was es in diesem Fall bedeutet ... :)
Piotr Dobrogost
4
@PiotrDobrogost foo &> fileist wie foo & > fileoder foo & : > file, das wird im Hintergrund ausgeführt und die Datei zum Schreiben ohne Befehl geöffnet (wird wahrscheinlich nicht so verwendet).
Stéphane Chazelas
5
@PiotrDobrogost, >&ist nicht ideal , entweder , wie es in Konflikt mit den >&2, >&-Betreibern. zshfügte es der Bequemlichkeit halber für csh-Benutzer hinzu (csh hat es nicht >&2). Es handelt sich nur um syntaktischen Zucker, nur um > file 2>&1handelsüblichen und tragbaren Zucker (für Bourne-ähnliche Muscheln).
Stéphane Chazelas