2010-09-26 6 views
121

Dites que j'ai trop programmes a et b que je peux courir avec ./a et ./b.Diff sortie de deux programmes sans fichiers temporaires

Est-il possible de différencier leurs sorties sans écrire d'abord dans des fichiers temporaires?

+0

En relation: [Comment puis-je comparer la sortie de deux commandes Unix pour trouver la différence?] (Http://stackoverflow.com/questions/4115545/how-can-i-compare-the-output-of-two -unix-commands-to-find-the-difference), [Comment différencier la sortie de deux commandes?] (http://askubuntu.com/questions/229447/how-do-i-diff-the-output -of-two-commands) – kenorb

Répondre

171

Utilisez <(command) pour transmettre la sortie d'une commande à un autre programme comme s'il s'agissait d'un nom de fichier. Bash canalise la sortie du programme vers un tube et transmet un nom de fichier comme /dev/fd/63 à la commande externe.

diff <(./a) <(./b) 

De même, vous pouvez utiliser >(command) si vous voulez quelque chose de tuyau dans une commande.

Ceci est appelé "Substitution de processus" dans la page de manuel de Bash.

+1

Un inconvénient à prendre en compte est que si ./a ou ./b échoue, l'appelant ne le trouvera pas. –

+3

L'OP a marqué la question bash, mais pour l'enregistrement, cela ne fonctionne pas dans n'importe quel autre shell. C'est une extension bash de la norme utilitaire Posix. – DigitalRoss

+3

J'ai essayé cette solution avec un programme Java et j'ai obtenu cette erreur: '-bash: erreur de syntaxe près d'un jeton inattendu (''. J'ai réessayé sans parenthèse et j'ai '-bash: java: Aucun fichier ou répertoire'. si la commande a des paramètres – styfle

20

Une option serait d'utiliser named pipes (FIFOs):

mkfifo a_fifo b_fifo 
./a > a_fifo & 
./b > b_fifo & 
diff a_fifo b_fifo 

... mais John Kugelman's solution est beaucoup plus propre.

+7

Ceci est plus portable si, fonctionne même sur mon routeur :-) – unhammer

+0

Vous feriez mieux de supprimer les tuyaux nommés après les avoir utilisés , avec 'rm a_fifo b_fifo'. –

22

Ajout à la fois les réponses, si vous voulez voir un côté par comparaison côte à côte, utilisez vimdiff:

vimdiff <(./a) <(./b) 

Quelque chose comme ceci:

enter image description here

+0

'vimdiff' crée des vues de comparaison de différences belles, intelligentes et interactives. Il semble venir avec le paquet 'vim' sur la plupart des systèmes. –

6

Ajout d'un peu plus au déjà de bonnes réponses (m'a aidé!):

La commande docker sort son aide à STD_ERR (c.-à-d. descripteur de fichier 2)

Je voulais voir si docker attach et docker attach --help a donné la même sortie

$ docker attach

$ docker attach --help

Après avoir tapés ces deux commandes, je l'ai fait ce qui suit:

$ diff <(!-2 2>&1) <(!! 2>&1)

!! est le même que -1 ce qui signifie exécuter la commande 1 avant celle-ci - la dernière commande

-2 moyens exécutent la commande deux avant celui-ci

2> 1 & moyens envoyer file_descriptor 2 sortie (std_err!) au même endroit que la sortie du fichier_descripteur 1 (STD_OUT)

Espérons que cela a été utile.

8

Pour tous les curieux, voici comment vous effectuez la substitution de processus en utilisant le Fish shell:

Bash:

diff <(./a) <(./b) 

Poisson:

diff (./a | psub) (./b | psub) 

Sons comme vous pouvez ne va pas l'autre maintenant.

+1

Merci! Je cherchais exactement cela. – z3ntu

Questions connexes