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

61

J'ai essayé toutes sortes de façons de rediriger les deux stdoutet stderrà /dev/nullsans aucun succès. J'ai presque toute ma vie couru bash que 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, les messages d'erreur de ls seront mis en sourdine. Cependant, si python.tgzest présent, une ligne avec être 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.

Torxed
la source

Réponses:

102

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 copier dans stderr ; si vous le dupliquez en premier, stderr indiquera simplement ce que stdout a indiqué à l'origine.

Bash , zsh et quelques 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 destinés à être portables.

rici
la source
1
En effet, j'ai lu le manuel de Shell Bourn. Il a déclaré que les versions ultérieures de /bin/shont implémenté la &>/dev/nullsyntaxe, apparemment pas ou si j'ai une version plus ancienne (que je ne peux en aucun cas
résonner
8
@ Torxed, OpenBSD shest basé sur pdksh. Il n'y a plus de Bourne shell aujourd'hui. cshintroduit >&aussi disponible en zsh. bashchoisi &>(maintenant également pris en charge par zshet certains pdkshdérivés) bien que cela casse clairement la conformité POSIX car sa foo &> filesyntaxe POSIX est parfaitement valide, ce qui signifie quelque chose de complètement différent.
Stéphane Chazelas
3
@ StéphaneChazelas (...) qui signifie quelque chose de complètement différent Vous m'avez laissé me demander ce que cela signifie dans ce cas ... :)
Piotr Dobrogost
4
@PiotrDobrogost, foo &> fileest comme foo & > fileou foo & : > file, c'est-à-dire qu'il tourne en arrière-plan et ouvre un fichier en écriture sans commande du tout (il est peu probable qu'il soit utilisé comme ça).
Stéphane Chazelas
5
@PiotrDobrogost, >&n'est pas idéale soit comme il est en conflit avec les >&2, >&-opérateurs. zshl'a ajouté pour plus de commodité pour les utilisateurs de csh (csh n'en a pas >&2). Ce ne sont que des sucres syntaxiques, il suffit d’utiliser > file 2>&1ce qui est standard et portable (à des coquilles de type Bourne).
Stéphane Chazelas