147 votes

Comment pouvez-vous diff deux pipelines dans Bash ?

Comment pouvez-vous diff deux conduites sans l'aide de fichiers temporaires en Bash? Disons que vous avez deux commande des pipelines:

foo | bar
baz | quux

Et vous voulez trouver l' diff de leurs sorties. Une solution serait évidemment de:

foo | bar > /tmp/a
baz | quux > /tmp/b
diff /tmp/a /tmp/b

Est-il possible de le faire sans l'utilisation de fichiers temporaires en Bash? Vous pouvez vous débarrasser de l'un fichier temporaire par la tuyauterie dans l'un des pipelines de diff:

foo | bar > /tmp/a
baz | quux | diff /tmp/a -

Mais vous ne pouvez pas la pipe de deux pipelines dans diff simultanément (pas en aucune façon évidente, au moins). Est-il une astuce impliquant /dev/fd à le faire sans l'aide de fichiers temporaires?

152voto

VonC Points 414372

Une ligne avec 2 fichiers tmp (pas ce que vous voulez) serait:

 foo | bar > file1.txt && baz | quux > file2.txt && diff file1.txt file2.txt

Avec bash, vous pouvez essayer:

 diff <(foo | bar) <(baz | quux)

Comme mentionné dans le BenM détaillées de réponse, < crée nommé anonyme de tuyaux-géré par bash, de sorte qu'ils sont créés et détruits automatiquement, contrairement aux fichiers temporaires.
Cependant, Daniel Cassidy points sur les "sans l'aide de fichiers temporaires" partie de la question n'est pas respectée: le système de fichiers est encore modifié (avec une entrée de répertoire représentant le canal nommé créé puis supprimé)

Sinon, comme vous le mentionnez dans votre question, vous avez à utiliser - comme STDIN

 foo | bar > file1.txt && baz | quux | diff file1.txt - && rm file1.txt

, car il semble y avoir aucun moyen facile de tuyau de plusieurs entrées pour une seule commande.

Vous ne pouvez pipe une sortie à plusieurs entrées avec la commande tee:

ls *.txt | tee /dev/tty txtlist.txt 

La commande ci-dessus affiche la sortie de ls *.txt pour le terminal et sorties dans le fichier texte txtlist.txt.

131voto

BenM Points 2241

En bash, vous pouvez utiliser sous-couches, pour exécuter les commande pipelines individuellement, en enfermant le pipeline au sein de la parenthèse. Vous pouvez alors préfixer avec Par exemple :

Les canaux nommés anonymes sont gérés par bash alors qu’ils sont créés et détruits automatiquement (à la différence des fichiers temporaires).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X