web-dev-qa-db-fra.com

Redirige stderr et stdout vers / dev / null avec / bin / sh

J'ai essayé toutes sortes de façons de rediriger à la fois stdout et stderr vers /dev/null sans succès. J'ai presque toute ma vie couru bash avec lequel je n'ai jamais eu ce problème, mais pour une fois dans BSD, je suis coincé avec /bin/sh.

Ce que j'ai essayé:

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

... qui fonctionne; si Python n'est pas présent, il coupera les messages d'erreur de ls. Cependant, si python.tgz est présent, une ligne avec une sortie qui ressemble à ceci:

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

J'ai essayé:

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

et

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

et

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

Rien ne fonctionne vraiment. Je ne peux que rediriger une des sorties, pas les deux en même temps.

65
Torxed

Cela fonctionnera dans n'importe quel shell compatible Posix:

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

Vous devez rediriger stdout d'abord avant de le dupliquer dans stderr ; si vous le dupliquez en premier, stderr indiquera simplement vers quoi stdout pointait initialement.

Bash , zsh et certains autres shells fournissent également le raccourci

ls good bad &>/dev/null

ce qui est pratique sur la ligne de commande mais doit être évité dans les scripts qui sont destinés à être portables.

110
rici