# ./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!