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


J'avais imaginé la façon la 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 se voit remettre 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 à diff directement?


133
2017-12-15 22:01


origine


En relation: Comment puis-je comparer la sortie de deux commandes Unix pour trouver la différence?, Diff diff de deux programmes sans fichiers temporaires - kenorb


Réponses:


Substitution de commande `…` substitue la sortie de la commande à la ligne de commande, diff voit la liste des fichiers dans les deux répertoires comme des arguments. Ce que tu veux c'est pour diff pour voir 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 substitution de processus Est-ce que.

diff <(ls old) <(ls new)

Les arguments pour diff ressemblera /dev/fd/3 et /dev/fd/4: ce sont des descripteurs de fichiers correspondant à deux pipes créées par bash. Quand diff ouvre ces fichiers, il sera connecté au côté lecture de chaque canal. Le côté écriture de chaque tuyau est connecté au ls commander.


194
2017-12-15 22:06



echo <(echo) <(echo) jamais pensé que cela pourrait être si intéressant: D - Aquarius Power
La substitution de processus est pas supporté par toutes les coques, mais les redirections de tuyaux sont un solution de contournement soignée. - Irfan434
Juste pour mentionner que l'analyse syntaxique n'est pas recommandée unix.stackexchange.com/questions/128985/why-not-parse-ls - Katu
@Katu Le problème avec ls est que cela gomme les noms de fichiers. Son analyse est fragile (elle ne fonctionne pas avec des noms de fichiers «étranges»). Pour comparer deux listes de répertoires, ça va tant que la sortie est sans ambiguïté. Avec des noms de fichiers arbitraires, cela nécessiterait une option telle que --quoting-style=escape. - Gilles


Coquille de poisson

Dans la coquille de poisson, vous devez enfoncer psub. Voici un exemple de comparaison avec Heroku et Dokku avec Au delà de toute comparaison:

bcompare (ssh me@myapp.pl dokku config myapp | sort | psub) (heroku config -a myapp | sort | psub)

2
2018-04-12 07:34



Un autre outil graphique est meld qui est open source et disponible dans les référentiels Ubuntu et EPEL. meldmerge.org - phiphi


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

Il y a donc trois options:

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

zsh savoured subscription, # 3, est très utile et peut être utilisé comme tel pour comparer le résultat de deux commandes à l'aide d'un outil diff, par exemple Beyond Compare:

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

Pour Beyond Compare, notez que vous devez utiliser bcomp pour ce qui précède (au lieu de bcompare) depuis bcomp lance la comparaison et attend pour qu'il se termine. Si tu utilises bcompare, qui lance la comparaison et quitte immédiatement à cause de quoi 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 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 <(...) 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 avec la lecture d'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.

Référence: https://unix.stackexchange.com/questions/393349/difference-between-subshells-and-process-substitution


2
2018-06-29 08:59



$(...) n'est pas la substitution de processus, c'est commander substitution. <(...) est la substitution de processus. C'est pourquoi le passage cité ne mentionne pas $(...) du tout. - muru