Deux tuyaux à une commande

9

Je suis un peu confus par la syntaxe suivante. Bien que cela fonctionne, il ne comprend pas pourquoi cela fonctionne. Il semble que deux commandes soient attachées à la commande diff. Mais n'y en a-t-il qu'un seul STDIN?

Exemples:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)
iblue
la source
Voici un lien vers le sujet pertinent - substitution de processus - dans la bashpage de manuel.
chepner

Réponses:

13

Les canaux sont simplement liés à des descripteurs de fichiers différents de 0 (stdin):

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

Un processus peut bien sûr avoir plus d'un descripteur de fichier ouvert à la fois, donc il n'y a pas de problème.

Sven Marnach
la source
Si je n'avais connu que ses pipes temporaires, j'aurais pu les chercher sur Google. Je vous remercie!
@iblue: Je ne pense pas que cela s'appelle des "tuyaux temporaires". Ce ne sont que des tuyaux, tels que créés par l' pipe()appel système.
Sven Marnach
Pour être très précis, il peut être appelé "canaux nommés anonymes", mais il suffit de le rechercher sur Google.
2
@WilliamPursell: Aucun fichier n'est impliqué. Le shell crée un canal anonyme en utilisant pipe()puis bifurque les sous-processus. Le processus principal n'ont des descripteurs de fichiers supplémentaires ouverts si un tuyau anonyme est utilisé. Ces descripteurs de fichiers supplémentaires sont transmis sous la forme , et le processus les ouvre généralement simplement en utilisant ces noms de fichiers. Cela entraînera leur édition, créant ainsi des descripteurs de fichiers encore plus ouverts. Le processus pourrait également utiliser le descripteur de fichier nommé immédiatement sans aucun appel ouvert .../dev/fd/...dup()
Sven Marnach
1
... comme démontré dans ce petit programme de test stupide . Après avoir compilé en a, je l'ai appelé comme ./a <(ls), et il a réussi à imprimer la liste des fichiers, prouvant que le décrypteur de fichiers nommé (63 dans mon cas) était déjà ouvert. Le bash peut utiliser des canaux nommés dans un répertoire temporaire sur des architectures différentes de Linux, auquel cas aucun descripteur de fichier supplémentaire ne serait ouvert lors de l'entrée dans le processus principal.
Sven Marnach