Comment diffère-t-il la sortie de deux commandes?

131

J'avais imaginé le moyen le plus simple de comparer le contenu de deux répertoires similaires serait quelque chose comme

diff 'ls old' 'ls new'

Mais je vois pourquoi cela ne fonctionne pas; diff reçoit une longue liste de fichiers sur la ligne de commande, plutôt que deux flux comme je l’espérais. Comment passer les deux sorties directement au diff?

    
posée Ternary 15.12.2012 - 23:01
la source

3 réponses

192

La substitution de commande '…' substitue la sortie de la commande à la ligne de commande, donc diff voit la liste des fichiers des deux répertoires comme des arguments. Ce que vous voulez, c'est que diff voit deux noms de fichiers sur sa ligne de commande et que le contenu de ces fichiers soit la liste des répertoires. C'est ce que fait la substitution de processus .

diff <(ls old) <(ls new)

Les arguments de diff ressembleront à /dev/fd/3 et /dev/fd/4 : ce sont des descripteurs de fichiers correspondant à deux tubes créés par bash. Lorsque diff ouvre ces fichiers, il sera connecté au côté lecture de chaque canal. Le côté écriture de chaque canal est connecté à la commande ls .

    
réponse donnée Gilles 15.12.2012 - 23:06
la source
2

Coquille de poisson

Dans Fish shell, vous devez accéder à psub . Voici un exemple de comparaison avec Heroku et Dokku avec Beyond Compare :

bcompare (ssh me@myapp.pl dokku config myapp | sort | psub) (heroku config -a myapp | sort | psub)
    
réponse donnée WooYek 12.04.2018 - 09:34
la source
1

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

Il y a donc trois options:

  1. Substitution de commande: $(...)
  2. Substitution de processus: <(...)
  3. Substitution de processus zsh-Flavored: =(...)

L'acquisition du processus aromatisé zsh, # 3, est très utile et peut être utilisée pour comparer le résultat 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 précédent (au lieu de bcompare ) puisque bcomp lance la comparaison et attend pour terminer. Si vous utilisez bcompare , cela lance la comparaison et se ferme immédiatement, à la suite de quoi les fichiers temporaires créés pour stocker la sortie des commandes disparaissent.

En savoir plus ici: lien

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 les deux types de substitution de processus pris en charge par zsh (i.e # 2 et # 3):

  

Si vous lisez la page de manuel de zsh, vous remarquerez peut-être que & lt; (...) est une autre forme de substitution de processus similaire à = (...). Il y a une différence importante entre les deux. Dans le cas & lt; (...), 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 & lt; (...) dans les exemples ci-dessus, tous auraient cessé de fonctionner, sauf pour fgrep -f & lt; (...). 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 & lt; (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.

Référence: lien

    
réponse donnée Ashutosh Jindal 29.06.2018 - 10:59
la source

Lire d'autres questions sur les étiquettes