J'avais imaginé le moyen le plus simple de comparer le contenu de deux répertoires similaires:
diff `ls old` `ls new`
Mais je vois pourquoi cela ne fonctionne pas; diff
est en train de recevoir une longue liste de fichiers sur la ligne de commande, plutôt que deux flux comme je l'avais espéré. Comment puis-je passer les deux sorties à diff directement?
command-line
diff
Ternaire
la source
la source
Réponses:
La substitution de commande substitue
`…`
le résultat de la commande dans la ligne de commande.diff
La liste des fichiers des deux répertoires est donc considérée comme un argument. Ce que vous voulez, c'est quediff
deux noms de fichier apparaissent sur la ligne de commande et que le contenu de ces fichiers soit la liste des répertoires. C'est ce que la substitution de processus fait.Les arguments à
diff
ressembler à/dev/fd/3
et/dev/fd/4
: ce sont des descripteurs de fichier correspondant à deux canaux créés par bash. Quanddiff
ouvrira ces fichiers, il sera connecté au côté lecture de chaque pipe. Le côté écriture de chaque canal est connecté à lals
commande.la source
echo <(echo) <(echo)
jamais pensé que cela pourrait être si intéressant: Dls
est qu'il modifie les noms de fichiers. L'analyse de sa sortie est fragile (il ne fonctionne pas avec des noms de fichiers «étranges»). Pour comparer deux listes de répertoires, tout va bien tant que le résultat est sans ambiguïté. Avec des noms de fichier arbitraires, cela nécessiterait une option telle que--quoting-style=escape
.<(…)
crée un tuyau. Il semble que le mélange ne fonctionne pas avec les tuyaux, vous ne pouvez donc pas l'utiliser<(…)
. Dans zsh, vous pouvez remplacer<(…)
par=(…)
et cela fonctionnera car=(…)
place les sorties intermédiaires dans un fichier temporaire. En ce qui concerne bash, je ne pense pas qu'il existe une syntaxe commode, vous devez gérer vous-même les fichiers temporaires.Pour zsh, utiliser
=(command)
crée automatiquement un fichier temporaire et le remplace=(command)
par le chemin du fichier lui-même. Avec Substitution de commande,$(command)
est remplacé par le résultat de la commande.Donc, il y a trois options:
$(...)
<(...)
=(...)
La substitution n ° 3 des processus aromatisés zsh est très utile et peut être utilisée comme ceci afin de comparer le résultat de deux commandes à l'aide d'un outil diff, par exemple Beyond Compare:
Pour Au-delà de la comparaison, notez que vous devez utiliser
bcomp
pour ce qui précède (au lieu debcompare
) carbcomp
lance la comparaison et attend son achèvement. Si vous utilisezbcompare
, cela lance la comparaison et se termine immédiatement en raison de la disparition des fichiers temporaires créés pour stocker la sortie des commandes.Lisez plus ici: http://zsh.sourceforge.net/Intro/intro_7.html
Notez aussi ceci:
et ce qui suit est la différence entre les deux types de substitution de processus pris en charge par zsh (c'est-à-dire n ° 2 et n ° 3):
Référence: https://unix.stackexchange.com/questions/393349/difference-between-subshells-and-process-substitution
la source
$(...)
n'est pas une substitution de processus, c'est une substitution de commande .<(...)
est la substitution de processus. C'est pourquoi le passage cité ne mentionne pas$(...)
du tout.Coquille de poisson
Dans Fish shell, vous devez canaliser psub . Voici un exemple de comparaison des configurations heroku et dokku avec Beyond Compare :
la source
meld
est open source et disponible dans les référentiels Ubuntu et EPEL. meldmerge.orgJ'utilise souvent la technique décrite dans la réponse acceptée:
mais je trouve que je l'utilise habituellement avec des commandes beaucoup plus complexes que l'exemple ci-dessus. Dans de tels cas, il peut être ennuyeux d’exécuter la commande diff. J'ai trouvé des solutions que d'autres pourraient trouver utiles.
Je trouve que 99% du temps, j'essaie les commandes appropriées avant d'exécuter diff. Par conséquent, les commandes que je veux différencier sont là dans mon histoire ... pourquoi ne pas les utiliser?
Je me sers de la commande Fix (fc) bash intégrée pour exécuter les deux dernières commandes:
Les drapeaux fc sont:
Les
-1
-1
références aux positions de début et de fin dans l'historique, dans ce cas, de la dernière commande à la dernière, qui ne produit que la dernière.Enfin, nous encapsulons ceci
$()
pour exécuter la commande dans un sous-shell.De toute évidence, il est un peu difficile à taper afin que nous puissions créer un alias:
Ou nous pouvons créer une fonction:
qui prend en charge la spécification des lignes d’historique à utiliser. Après avoir utilisé les deux, je trouve que l'alias est la version que je préfère.
la source