Quando você executa:
ping -q -c 1 google.com > /dev/null && echo online || echo offline
Você está basicamente redirecionando apenas a saída do fluxo 1 (ou seja stdout
) para /dev/null
.
Isso é bom quando você deseja redirecionar a saída produzida pela execução normal de um programa. No entanto, caso você também deseje redirecionar a saída causada por todos os erros, avisos ou falhas, você também deve redirecionar o stderr
fluxo ou Erro Padrão para /dev/null
.
Uma maneira de fazer isso é preceder o número do fluxo que você deseja redirecionar para o operador de redirecionamento, >
assim:Command 2> /dev/null
Portanto, seu comando seria semelhante a:
ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline
Mas observe que já redirecionamos um fluxo para /dev/null
. Por que não simplesmente pegar carona no mesmo redirecionamento? O Bash nos permite fazer isso especificando o número do fluxo para o qual redirecionar. 2>&1
.
Observe o &
caractere após o operador de redirecionamento. Isso informa ao shell que o que aparece a seguir não é um nome de arquivo, mas um identificador para o fluxo de saída.
ping -q -c 1 google.com > /dev/null 2>&1 echo online || echo offline
Tenha cuidado com os operadores de redirecionamento, a ordem deles é muito importante. Se você redirecionar na ordem errada, você terá resultados inesperados.
Outra maneira pela qual você pode obter um silêncio completo é redirecionando todos os fluxos de saída para /dev/null
usar este atalho: &>/dev/null
(ou redirecione para um arquivo de log com &>/path/to/file.log
).
Portanto, escreva seu comando como:
ping -q -c 1 google.com &> /dev/null && echo online || echo offline
&>/dev/null
sim. Obrigado a todos pela ajuda instantânea!