5.4. Substitution de processus

La substitution de processus généralise la notion de tube. La principale forme de substitution de processus est la suivante : cmd <(suite_cmds)

Le shell crée un fichier temporaire, connecte la sortie de suite_cmds à ce fichier temporaire puis lance l’exécution de cette suite de commandes. Cette suite de commandes écrit ses résultats dans le fichier temporaire. Ensuite, le shell remplace la syntaxe <(suite_cmds) par la référence à ce fichier temporaire et lance l’exécution de la commande cmd.

Du point de vue de cette commande cmd, tout se passe comme si les données produites par suite_cmds étaient présentes dans un fichier ordinaire dont l’utilisateur lui aurait passé le nom en argument.

$ ls -l
total 4 
-rw-r--r-- 1 sanchis sanchis   0  8 janv. 20:55 err 
-rw-r--r-- 1 sanchis sanchis   0  8 janv. 20:33 f 
-rw-r--r-- 1 sanchis sanchis 160  8 janv. 20:41 trace
$
$ wc -l <(ls -l)
4 /dev/fd/63		=> la commande ls  –l affiche 4 lignes
$

Dans l’exemple ci-dessus, la sortie de la commande ls –l a été enregistrée dans un fichier temporaire /dev/fd/63. Puis, la commande wc –l /dev/fd/63 a été exécutée.

La substitution de processus est intéressante car elle permet de créer en parallèle plusieurs flots de données qui seront ensuite traités séquentiellement par la même commande.

La syntaxe de la commande se présente alors sous la forme : cmd <(suite_cmds1) <(suite_cmds2)

L’exécution des suites de commandes suite_cmds_i est effectuée en parallèle, chaque flot de résultats produit par celles-ci étant enregistré dans un fichier temporaire différent. Puis, le shell substitue chaque syntaxe <(suite_cmds_i) par la référence au fichier temporaire correspondant. Enfin, la commande cmd est exécutée munie de ces différents arguments.

L’exemple ci-dessous illustre le cas où l’on souhaite afficher la première ligne de deux fichiers fich1 et fich2 non triés et pouvant contenir des doublons.

$ cat fich1
Pierre
Anne
Pierre
Pierre
Jean
$ 
$ cat fich2
Paul
Paul
Pierre
Jean
$ 
$ head -q -n 1   <(sort fich1 | uniq)   <(sort fich2 | uniq)
Anne
Jean
$
$

Dans un premier temps, les fichiers fich1 et fich2 sont triés (commande unix sort) en parallèle et débarrassés de leurs doublons (commande unix uniq). Le résultat du traitement de ces deux fichiers est placé dans deux fichiers temporaires préalablement créés par bash (les contenus de fich1 et fich2 restent, eux, inchangés). Puis, la première ligne (option –n 1 de la commande unix head) de chacun de ces deux fichiers est affichée, sans mentionner les noms de fichiers (option -q).

En résumé, la substitution de processus <(suite_cmds) peut être utilisée dans une commande cmd en lieu et place d’un nom de fichier dont le contenu sera traité par cette commande.