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?
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?
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.
Un inconvénient à prendre en compte est que si ./a ou ./b échoue, l'appelant ne le trouvera pas. –
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
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
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.
Ceci est plus portable si, fonctionne même sur mon routeur :-) – unhammer
Vous feriez mieux de supprimer les tuyaux nommés après les avoir utilisés , avec 'rm a_fifo b_fifo'. –
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:
'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. –
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.
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.
Merci! Je cherchais exactement cela. – z3ntu
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