C'est ce qu'on appelle la substitution de processus.
3.5.6 Substitution de processus
La substitution de processus permet de faire référence à l'entrée ou à la sortie d'un processus à l'aide d'un nom de fichier.
La liste de processus est exécutée de manière asynchrone et son entrée ou sa sortie apparaît sous la forme d'un nom de fichier. Ce nom de fichier est passé en argument à la commande en cours à la suite de l'expansion. Si la forme>(list) est utilisée, l'écriture dans le fichier fournira une entrée pour la liste. Si la forme <(list) est utilisée, le fichier passé en argument doit être lu pour obtenir la sortie de list. Notez qu'aucun espace ne peut apparaître entre le
et la parenthèse gauche, sinon la construction serait interprétée comme une redirection. La substitution de processus est prise en charge sur les systèmes prenant en charge les tubes nommés (FIFO) ou la méthode /dev/fd de dénomination des fichiers ouverts.
Ce n'est pas seulement une chose bash telle qu'elle est apparue à l'origine dans ksh, mais ce n'est pas dans la norme posix.
Sous le capot, la substitution de processus a deux implémentations. Sur les systèmes prenant en charge
/dev/fd
(la plupart des systèmes de type Unix) cela fonctionne en appelant lepipe(
) appel système, qui renvoie un descripteur de fichier$fd
pour un nouveau canal anonyme, puis en créant la chaîne/dev/fd/$fd
, et le remplace sur la ligne de commande. Sur les systèmes sans/dev/fd
support, il appellemkfifo
avec un nouveau nom de fichier temporaire pour créer un tube nommé, et remplace ce nom de fichier sur la ligne de commande.
Vous pouvez penser à <( somecommand )
comme nom de fichier d'un fichier temporaire contenant la sortie de somecommand
. En d'autres termes,
utility < <( somecommand )
est un raccourci pour
somecommand >tempfile
utility <tempfile
rm -f tempfile
Et
utility <( somecommand )
est un raccourci pour
somecommand >tempfile
utility tempfile # notice the lack of redirection here (utility expected to read from "tempfile")
rm -f tempfile
De même >( somecommand )
peut être considéré comme le nom de fichier d'un fichier temporaire qui sera introduit dans somecommand
sur son entrée standard. En d'autres termes,
utility > >( somecommand )
est un raccourci pour
utility >tempfile
somecommand <tempfile
rm -f tempfile
Et
utility >( somecommand )
pourrait éventuellement être un raccourci pour
mkfifo temppipe
somecommand <temppipe &
utility temppipe # utility is expected to write to "temppipe"
rm -f temppipe
(ou quelque chose de similaire)