Como redirecionar a saída de qualquer comando?

14

Estou tentando escrever um script simples para monitorar meu status de rede, sem toda a saída de ping :

ping -q -c 1 google.com > /dev/null && echo online || echo offline

O problema é que, quando não estou conectado, ainda recebo uma mensagem de erro na saída:

ping: unknown host google.com
offline

Como posso manter esta mensagem de erro fora do meu resultado?

    
por operalala 28.01.2014 / 19:29

3 respostas

26

Quando você executa:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

Você essencialmente redireciona apenas a saída do fluxo 1 (ou seja, stdout ) para /dev/null .

Isto é bom quando você quer redirecionar a saída que é produzida pela execução normal de um programa. No entanto, caso deseje também redirecionar a saída causada por todos os erros, avisos ou falhas, você também deve redirecionar o fluxo stderr ou Erro padrão para /dev/null .

Uma maneira de fazer isso é prefixar o número do fluxo que você deseja redirecionar para o operador de redirecionamento, > assim: Command 2> /dev/null

Assim, seu comando ficaria assim:

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 diz 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

Cuidado com os operadores de redirecionamento, o pedido deles é muito importante. Se você fosse redirecionar na ordem errada, você acabaria com resultados inesperados.

Outra maneira de atingir o silêncio completo é redirecionar os fluxos de saída all para /dev/null usando este atalho: &>/dev/null (ou redirecionar para um arquivo de log com &>/path/to/file.log ). / p>

Portanto, escreva seu comando como:

ping -q -c 1 google.com &> /dev/null && echo online || echo offline
    
por 28.01.2014 / 19:55
9

Você precisa redirecionar a saída padrão ( > ou 1> ) e o erro padrão ( 2> ):

ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline

ou redirecionar um para o outro:

ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
    
por 28.01.2014 / 19:34
8
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

Exemplos

$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online

$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline

Acelerando o ping

Dependendo da sua implementação de ping , você pode estar limitado a uma única contagem -c 1 . Algumas implementações permitirão que você fique abaixo disso, mas, no essencial, você terá que esperar que as pesquisas ruins atinjam o tempo limite. Então, em vez de usar ping , talvez você queira usar fing .

lentidão do ping com falha

$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014

$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014

é muito mais rápido falhar

$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014

$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014
    
por 28.01.2014 / 19:35