Diff diff de deux programmes sans fichiers temporaires

Disons que j’ai aussi des programmes a et b que je peux utiliser avec ./a et ./b .

Est-il possible de diffuser leurs sorties sans d’abord écrire 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 dirige la sortie du programme vers un canal et transmet un nom de fichier tel que /dev/fd/63 à la commande externe.

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

De même, vous pouvez utiliser >(command) si vous souhaitez insérer un élément dans une commande.

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

En ajoutant les deux réponses, si vous voulez voir une comparaison côte à côte, utilisez vimdiff :

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

Quelque chose comme ça:

entrer la description de l'image ici

Une option serait d’utiliser des canaux nommés (FIFO) :

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

… mais la solution de John Kugelman est beaucoup plus propre.

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

Frapper:

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

Poisson:

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

Malheureusement, la mise en œuvre chez les poissons est actuellement déficiente ; Les poissons seront suspendus ou utiliseront un fichier temporaire sur le disque. Vous ne pouvez pas non plus utiliser psub pour la sortie de votre commande.

En ajoutant un peu plus aux bonnes réponses (cela m’a aidé!):

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

Je voulais voir si docker attach et docker attach --help donnaient la même sortie

$ docker attach

$ docker attach --help

Après avoir tapé ces deux commandes, j’ai fait ce qui suit:

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

!! est identique à! -1 ce qui signifie que la commande 1 doit être exécutée avant celle-ci – la dernière commande

! -2 signifie exécuter la commande deux avant celle-ci

2> & 1 signifie envoyer la sortie file_descriptor 2 (STD_ERR) au même endroit que la sortie file_descriptor 1 (STD_OUT)

J’espère que cela a été utile.

Pour zsh, utiliser =(command) crée automatiquement un fichier temporaire et remplace =(command) par le chemin du fichier lui-même. Avec la substitution de processus normale, $(command) est remplacé par la sortie de la commande.

Cette fonctionnalité zsh est très utile et peut être utilisée comme telle pour comparer la sortie de deux commandes à l’aide d’un outil de comparaison, par exemple Beyond Compare:

 bcomp =(ulimit -Sa | sort) =(ulimit -Ha | sort) 

Pour Beyond Compare, notez que vous devez utiliser bcomp pour le bcomp (au lieu de bcompare ) car bcomp lance la comparaison et attend son achèvement. Si vous utilisez bcompare , cela lance la comparaison et quitte immédiatement pour que les fichiers temporaires créés pour stocker la sortie des commandes disparaissent.

Lire plus ici: http://zsh.sourceforge.net/Intro/intro_7.html

Notez également ceci:

Notez que le shell crée un fichier temporaire et le supprime lorsque la commande est terminée.

et ce qui suit est la différence entre $(...) et =(...) :

Si vous lisez la page de manuel de zsh, vous remarquerez peut-être que <(...) est une autre forme de substitution de processus similaire à = (...). Il y a une différence importante entre les deux. Dans le cas <(...), le shell crée un canal nommé (FIFO) au lieu d’un fichier. C'est mieux, car il ne remplit pas le système de fichiers; mais ça ne marche pas dans tous les cas. En fait, si nous avions remplacé = (...) par <(...) dans les exemples ci-dessus, ils auraient tous cessé de fonctionner sauf pour fgrep -f <(...). Vous ne pouvez pas éditer un tube, ni l'ouvrir en tant que dossier de messagerie. fgrep, cependant, n'a aucun problème à lire une liste de mots d'un tube. Vous pouvez vous demander pourquoi diff <(foo) bar ne fonctionne pas, puisque foo | diff - bar works; En effet, diff crée un fichier temporaire s'il constate que l'un de ses arguments est -, puis copie son entrée standard dans le fichier temporaire.