Redireccionar stderr y stdout a / dev / null con / bin / sh

61

He intentado todo tipo de formas de redirigir tanto stdouty stderrhasta /dev/nullsin ningún éxito. Tengo casi toda mi vida corriendo bash con el que nunca he tenido este problema, pero por una vez en BSD estoy atrapado /bin/sh.

Lo que he intentado:

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

... que funciona; Si Python no está presente, silenciará los mensajes de error de ls. Sin embargo, si python.tgzestá presente, se generará una línea con el siguiente aspecto:

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

He intentado:

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

y

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

y

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

Nada realmente funciona. Solo puedo redirigir una de las salidas, no ambas al mismo tiempo.

Torxed
fuente

Respuestas:

102

Esto funcionará en cualquier shell compatible con Posix:

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

Primero debe redirigir stdout antes de duplicarlo en stderr ; si lo duplica primero, stderr solo apuntará a lo que stdout apuntó originalmente.

Bash , zsh y algunos otros shells también proporcionan el acceso directo

ls good bad &>/dev/null

lo cual es conveniente en la línea de comandos pero debe evitarse en los scripts que están destinados a ser portátiles.

rici
fuente
1
De hecho, leí el manual de Bourn Shell. Dijo que las versiones posteriores de /bin/shhan implementado la &>/dev/nullsintaxis, aparentemente no es así o tengo una versión anterior (que no puedo hacer eco de ninguna manera, ejecutando OpenBSD 5.3 aunque debería ser suficiente)
Torxed
8
@Torxed, OpenBSD shse basa en pdksh. No hay más Bourne shell hoy en día. cshintroducido >&también disponible en zsh. basheligió &>(ahora también soportado por zshy algunos pdkshderivados) aunque claramente rompe el cumplimiento POSIX ya que foo &> filees una sintaxis POSIX perfectamente válida que significa algo completamente diferente.
Stéphane Chazelas
3
@ StéphaneChazelas (...) que significa algo completamente diferente Me dejaste preguntando qué significa en este caso ... :)
Piotr Dobrogost
44
@PiotrDobrogost, foo &> filees como foo & > fileo foo & : > file, que se ejecuta en segundo plano y abre el archivo para escribir sin ningún comando (es poco probable que se use así).
Stéphane Chazelas
55
@PiotrDobrogost, >&no es lo ideal, ya sea como entra en conflicto con los >&2, >&-operadores. zshlo agregó para conveniencia de los usuarios de csh (csh no tiene >&2). Son solo azúcar sintáctico, solo use el > file 2>&1que sea estándar y portátil (para conchas tipo Bourne).
Stéphane Chazelas