La question dans l'avis de prime actuel:
l'exemple général est trop compliqué. Quelqu'un peut-il expliquer comment mettre en œuvre l'exemple suivant?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
semble avoir une réponse ici .
Comme le montre la réponse de Gilles , l'idée générale est d'envoyer la sortie des commandes "producteur" à de nouveaux fichiers de périphérique 1 à différents stades d'un pipeline, en les mettant à la disposition des commandes "consommateurs", qui peuvent éventuellement prendre des noms de fichiers comme arguments ( en supposant que votre système vous donne accès aux descripteurs de fichiers en tant que /dev/fd/X).
La façon la plus simple de réaliser ce que vous recherchez est probablement:
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
(Utiliser file1.xzà la place de "$1"pour la lisibilité et xz -cdau lieu de cat ... | xz -dcar une seule commande suffit).
La sortie de la première commande "producteur" xz -cd file1.xz, est dirigée vers une commande composée ( {...}); mais, au lieu d'être consommé immédiatement comme entrée standard de la commande suivante, il est dupliqué dans le descripteur de fichier 3et ainsi rendu accessible à tout ce qui se trouve dans la commande composée comme /dev/fd/3. La sortie de la deuxième commande "producteur" xz -cd file2.xz, qui ne consomme ni son entrée standard ni quoi que ce soit du descripteur de fichier 3, est ensuite dirigée vers la commande "consumer" diff, qui lit à partir de son entrée standard et de /dev/fd/3.
La duplication de la tuyauterie et des descripteurs de fichiers peut être ajoutée afin de fournir des fichiers de périphérique pour autant de commandes "producteurs" que nécessaire, par exemple:
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
Bien que cela puisse ne pas être pertinent dans le contexte de votre question spécifique, il convient de noter que:
cmd1 <(cmd2) <(cmd3), cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0Et ( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )avoir des effets potentiels sur l'environnement d'exécution initial.
Contrairement à ce qui se passe dans cmd1 <(cmd2) <(cmd3), cmd3et cmd1dans cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0ne pourra lire aucune entrée de l'utilisateur. Cela nécessitera d'autres descripteurs de fichiers. Par exemple, pour faire correspondre
diff <(echo foo) <(read var; echo "$var")
vous aurez besoin de quelque chose comme
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 Plus d'informations à ce sujet peuvent être trouvées sur U&L, par exemple dans Understanding / dev et ses sous-répertoires et fichiers .