C'est ce qu'on appelle la substitution de processus.
Le site <(list)
est supportée par les deux, bash
y zsh
. Il fournit un moyen de transmettre la sortie d'une commande ( list
) à une autre commande en utilisant un tube ( |
) n'est pas possible. Par exemple, lorsqu'une commande ne prend tout simplement pas en charge les entrées provenant de STDIN
ou vous avez besoin de la sortie de plusieurs commandes :
diff <(ls dirA) <(ls dirB)
<(list)
connecte la sortie de list
avec un fichier dans /dev/fd
si le système le supporte, sinon un tube nommé (FIFO) est utilisé (ce qui dépend aussi du support du système ; aucun manuel ne dit ce qui se passe si les deux mécanismes ne sont pas supportés, probablement qu'il s'arrête avec une erreur). Le nom du fichier est alors passé comme argument sur la ligne de commande.
zsh
soutient en outre =(list)
en tant que remplaçant éventuel de <(list)
. Avec =(list)
un fichier temporaire est utilisé à la place du fichier dans /dev/fd
ou une FIFO. Il peut être utilisé en remplacement de <(list)
si le programme a besoin de lseek dans la sortie.
Selon le Manuel ZSH il pourrait également y avoir d'autres problèmes avec la façon <(list)
travaux :
Le site =
est utile car le formulaire /dev/fd
et l'implémentation du tube nommé de <(...)
ont des inconvénients. Dans le premier cas, certains programmes peuvent fermer automatiquement le descripteur de fichier en question avant d'examiner le fichier sur la ligne de commande, notamment si cela est nécessaire pour des raisons de sécurité, comme lorsque le programme est exécuté en setuid. Dans le second cas, si le programme n'ouvre pas réellement le fichier, le sous-shell qui tente de lire ou d'écrire dans le pipe va (dans une implémentation typique, différents systèmes d'exploitation peuvent avoir un comportement différent) se bloquer pour toujours et devra être tué explicitement. Dans les deux cas, le Shell fournit réellement l'information en utilisant un tube, de sorte que les programmes qui s'attendent à lseek (voir la page de manuel lseek(2)
) sur le fichier ne fonctionnera pas.