Redirecione stderr e stdout para / dev / null com / bin / sh

61

Eu tentei todos os tipos de maneiras de redirecionar ambos stdoute stderrpara /dev/nullsem sucesso. Eu tenho quase toda a minha vida bash que eu nunca tive esse problema, mas pela primeira vez no BSD eu estou preso /bin/sh.

O que eu tentei:

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

... o que funciona; se o Python não estiver presente, silenciará as mensagens de erro de ls. No entanto, se python.tgzestiver presente, será exibida uma linha com a seguinte aparência:

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

Eu tentei:

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

Nada realmente funciona. Só posso redirecionar uma das saídas, não as duas ao mesmo tempo.

Torxed
fonte

Respostas:

102

Isso funcionará em qualquer shell compatível com Posix:

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

Você precisa redirecionar o stdout primeiro antes de duplicá-lo no stderr ; se você duplicá-lo primeiro, o stderr apontará apenas para o que o stdout apontou originalmente.

Bash , zsh e algumas outras conchas também fornecem o atalho

ls good bad &>/dev/null

o que é conveniente na linha de comando, mas deve ser evitado em scripts que devem ser portáveis.

rici
fonte
1
Na verdade, eu li o manual do shell bourn. Ele afirmou que versões posteriores do /bin/shimplementaram a &>/dev/nullsintaxe, aparentemente não tão ou eu tenho uma versão mais antiga (o que eu não posso ecoar de forma alguma, correndo OpenBSD 5.3 tho assim deve ser suficiente)
Torxed
8
@ Torxed, o OpenBSD shé baseado em pdksh. Hoje não há mais conchas Bourne. cshintroduzido >&também disponível em zsh. bashescolheu &>(agora também suportado por zshe alguns pdkshderivados), apesar de claramente quebrar a conformidade com o POSIX, pois foo &> fileé uma sintaxe POSIX perfeitamente válida, o que significa algo completamente diferente.
Stéphane Chazelas
3
@ StéphaneChazelas (...) o que significa algo completamente diferente Você me deixou perguntando o que isso significa, neste caso ... :)
Piotr Dobrogost
4
@PiotrDobrogost, foo &> fileé como foo & > fileor foo & : > file, que é executado foo em segundo plano e abre um arquivo para gravação sem nenhum comando (é improvável que seja usado assim).
Stéphane Chazelas
5
@PiotrDobrogost, >&não é o ideal ou como ele entra em conflito com os >&2, >&-operadores. zshadicionou-o por conveniência para usuários do csh (o csh não possui >&2). Eles são apenas açúcar sintático, basta usar o > file 2>&1que é padrão e portátil (para cascas tipo Bourne).
Stéphane Chazelas