Comment s'appelle la syntaxe bash '<(contenu du fichier)'?

25

Cette réponse sur Security StackExchange utilise une syntaxe bash intéressante pour générer un fichier en ligne:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

Ce bit est particulièrement intéressant:

<(openssl ecparam -name secp384r1)

Courir juste:

echo <(openssl ecparam -name secp384r1)

Je reviens /dev/fd/63

Cela semble donc créer un descripteur de fichier temporaire avec le contenu du fichier.

Comment ça s'appelle?

mikemaccana
la source
3
Notez que le "fichier" résultant est en fait un canal nommé et que certains programmes ne les prennent pas en charge comme arguments de fichier. Exemple: git diff --no-index file1 <(cat file2)échouera avec: error: /dev/fd/63: unsupported file type. Vous pouvez également voir error: readlink("/dev/fd/63"): No such file or directorysi l'implémentation crée un lien symbolique vers le canal (apparaît comme un lien rompu pour moi pour une raison quelconque).
Kelvin

Réponses:

35

Cela s'appelle la substitution de processus et est une fonctionnalité de bash, zsh et ksh (et peut-être d'autres, je ne sais pas). Ce n'est pas POSIX et vous ne devriez pas l'utiliser dans du code portable, mais c'est très utile.

Voici la section pertinente du manuel bash:

3.5.6 Substitution de processus

La substitution de processus est prise en charge sur les systèmes qui prennent en charge les canaux nommés (FIFO) ou la méthode / dev / fd pour nommer les fichiers ouverts. Il prend la forme de

  <(list) 

ou

  >(list) 

La liste des processus est exécutée avec son entrée ou sa sortie connectée à un FIFO ou à un fichier dans / dev / fd. Le nom de ce fichier est passé en argument à la commande en cours à la suite de l'expansion. Si le formulaire> (liste) est utilisé, l'écriture dans le fichier fournira une entrée pour la liste. Si le formulaire <(liste) est utilisé, le fichier passé en argument doit être lu pour obtenir la sortie de la liste. Notez qu'aucun espace ne doit apparaître entre le <ou> et la parenthèse gauche, sinon la construction serait interprétée comme une redirection.

Lorsqu'elles sont disponibles, la substitution de processus est effectuée simultanément avec l'expansion des paramètres et des variables, la substitution des commandes et l'expansion arithmétique.

terdon
la source