Comment redirect la sortie de n'importe quelle command?

J'essaye d'écrire un script simple pour surveiller mon état de réseau, sans toute la sortie de ping :

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

Le problème est que quand je ne suis pas connecté, je reçois toujours un message d'erreur dans ma sortie:

 ping: unknown host google.com offline 

Comment puis-je garder ce message d'erreur de ma sortie?

Lorsque vous exécutez:

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

Vous ne faites que redirect la sortie du stream 1 (c'est-à-dire stdout ) vers /dev/null .

C'est bien quand vous voulez redirect la sortie produite par l'exécution normale d'un programme. Cependant, si vous souhaitez également redirect la sortie provoquée par toutes les erreurs, avertissements ou échecs, vous devez également redirect le stream stderr ou Standard Error vers /dev/null .

Une façon d'y parvenir est de faire précéder le numéro du stream que vous souhaitez redirect vers l'opérateur de redirection, comme ceci: Command 2> /dev/null

Par conséquent, votre command ressemblerait à:

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

Mais notez que nous avons déjà redirigé un stream vers /dev/null . Pourquoi ne pas simplement se greffer sur la même redirection? Bash nous permet de le faire en spécifiant le numéro de stream vers lequel redirect. 2>&1 .

Notez le caractère & après l'opérateur de redirection. Cela indique au shell que ce qui apparaît ensuite n'est pas un nom de file, mais un identifiant pour le stream de sortie.

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

Soyez prudent avec les opérateurs de redirection, leur ordre importe beaucoup. Si vous deviez redirect dans le mauvais ordre, vous obtiendrez des résultats inattendus.

Une autre façon d'atteindre le silence complet consiste à redirect tous les stream de sortie vers /dev/null aide de ce raccourci: &>/dev/null (ou redirect vers un file journal avec &>/path/to/file.log ).

Par conséquent, écrivez votre command comme:

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

Vous devez redirect la sortie standard ( > ou 1> ) et l'erreur standard ( 2> ):

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

ou, redirect l'un vers l'autre:

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

Exemples

 $ 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 

Accélérer le ping

En fonction de l'implémentation de votre ping vous pouvez être limité à un seul count -c 1 . Certaines implémentations vous permettent d'aller en dessous de cela, mais vous devez essentiellement attendre les mauvaises searchs pour expirer. Donc, au lieu d'utiliser ping vous pouvez utiliser fing place.

lenteur de ping échouant

 $ 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 

fing est beaucoup plus rapide à échouer

 $ 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