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 -cd
au lieu de cat ... | xz -d
car 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 3
et 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<&0
Et ( 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)
, cmd3
et cmd1
dans cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
ne 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 .