2010-07-21 11 views
7

Dans Mathematica, il est possible de réutiliser la sortie de la commande précédente en utilisant%.Utilisation de la sortie des commandes précédentes dans bash

Est-ce que quelque chose de similaire est possible pour bash (ou un autre shell)? Par exemple, je lance une make qui donne des avertissements, mais je veux trouver tous les avertissements. Alors, je tape

make | grep "warning" 

mais je ne suis pas en mesure de voir la sortie de la marque alors.

Je voudrais taper quelque chose comme ceci:

make 
% | grep "warning" 

Répondre

8

Puisque la quantité de sortie est indéterminée, il n'a pas de sens pour bash de le stocker pour vous pour afficher de nouveau. Mais il existe une solution alternative à votre problème:

La commande tee vous permet de dupliquer un flux de sortie dans un fichier. Donc, si vous êtes prêt à utiliser un fichier pour le stockage temporaire, vous pouvez faire quelque chose comme ceci:

make | tee output.txt 
grep "warning" output.txt 

Cette solution évite l'exécution make deux fois, ce qui pourrait être (a) et coûteux (b) incompatibles: la deuxième make peut faire moins de travail que le premier car certaines cibles ont déjà été faites la première fois.

Note: Je n'ai pas essayé cela. Vous devrez peut-être jouer avec l'erreur et les flux de sortie, ou autres.

+0

droit. cela n'a pas de sens de stocker toute la sortie. La commande tee semble utile cependant. Et j'ai essayé. Fonctionne parfaitement. Merci. – Harsh

2

Je ne suis pas sûr si la commande make envoie des avertissements à stderr mais je le soupçonne. essayez ceci

make 2&>1 |grep 'warning' 

il redirigera stderr vers stdout.

Notez également que vous ne pouvez pas grep quelque chose qui ne va pas à stdout.

2

Si vous utilisez tee pour dupliquer le flux de sortie vers/dev/stderr, vous n'avez pas besoin de fichier temporaire; De plus, après cela, vous pouvez filtrer le flux stdout avec sed pour créer un fichier make_warning.log - le tout sur une ligne de tubes shell Unix.

make 2>&1 | tee /dev/stderr | \ 
    sed -E -n 's/(.*[Ww][Aa][Rr][Nn][Ii][Nn][Gg].*)/\1/p' > make_warning.log 
2

Swap les flux stdout et stderr de se connecter l'ensemble du flux stderr:

make 3>&2 2>&1 1>&3 3>&- | tee /dev/stderr > stderr.log 
Questions connexes