Eu tenho muitos scripts shell e python no meu crontab que terminam com:
command.sh > /dev/null 2>&1
ou
command.sh 2>&1 >/dev/null
Eu sei que:
>
é para redirecionar
/dev/null
é um buraco negro onde qualquer dado enviado, será descartado
2
é o descritor de arquivo para Erro Padrão
>
é para redirecionar
&
é o símbolo para descritor de arquivo (sem ele, o seguinte 1 seria considerado um nome de arquivo)
1
é o descritor de arquivo para Standard Out
Portanto command.sh >/dev/null 2>&1
, redireciona a saída do meu programa para /dev/null. Inclua o erro padrão e a saída padrão.
ambos têm o mesmo resultado e funcionam bem, mas por que alguns usam o primeiro tipo e outros usam o outro?
Os comandos estão realizando dois redirecionamentos:
> /dev/null
redireciona a saída padrão para/dev/null
2>&1
redireciona o erro padrão para a saída padrãoComo você adivinhou corretamente, o efeito global é que tanto a Saída Padrão quanto o Erro Padrão são redirecionados para
/dev/null
.Os dois redirecionamentos devem ser interpretados pelo shell, não pelo programa real chamado; assim, eles são anexados ao final da linha de comando. Eles são logicamente distintos, embora seus efeitos sejam cumulativos; assim eles podem ser especificados em qualquer ordem que você preferir.
TL;DR: os dois comandos são completamente equivalentes, a diferença é puramente cosmética.