impede que um comando envie stdout & stderr para qualquer terminal ou arquivo [duplicado]

6

Eu gostaria de evitar que meu programa enviasse stdout e stderr para qualquer terminal, arquivo ou dispositivo. Por isso, tenho três ordens cruzando minha mente, mas não consigo distinguir suas diferenças. Você poderia, por favor, explicar o significado de cada um deles para mim?

# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
    
por Saman 28.04.2015 / 18:17

1 resposta

14
# ./run > /dev/null

Isso redireciona o stdout para /dev/null , mas não faz nada com stderr. Desde que você pediu para redirecionar de stdout e stderr, isso não faz o que você quer.

# ./run > /dev/null 1>&2

Isso redireciona o stdout para /dev/null e, em seguida, ele redireciona stdout novamente ( 1> ) para onde stderr aponta para ( &2 ) que é provavelmente o terminal e é provavelmente para onde o stdout foi apontado antes de ser redirecionado. Portanto, o efeito líquido aqui é (provavelmente) nenhum redirecionamento para o stdout, e quanto ao stderr, você ainda não faz nada com ele. Então, isso também não é o que você quer.

# ./run > /dev/null 2>&1

Isso redireciona o stdout para /dev/null e, em seguida, ele redireciona stderr ( 2> ) para onde stdout aponta, que é /dev/null , porque é onde você acabou de redirecioná-lo. Isso parece ser o que você quer.

I cannot distinguish their differences.

Na verdade, você deve ser capaz de distinguir as diferenças com bastante facilidade. Digamos que ./run contenha isso:

#!/bin/sh
echo stdout
echo stderr >&2

Os resultados devem ser os seguintes:

# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1

A diferença é clara!

    
por 28.04.2015 / 18:25