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)
bash
page de manuel.Réponses:
Les canaux sont simplement liés à des descripteurs de fichiers différents de 0 (stdin):
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.
la source
pipe()
appel système.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()
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.