La substitution de processus est la contre-partie de la substitution de commande. La substitution de commande affecte à une variable le résultat d'une commande, comme dans contenu_rep=`ls -al` ou xref=$( grep mot fichdonnées). La substitution de commande "nourrit" un processus avec la sortie d'un autre processus (en d'autres termes, elle envoie le résultat d'une commande à une autre commande).
Patron de substitution de commande
>(commande)
<(commande)
Ceci lance la substitution de processus. Cette syntaxe utilise les fichiers /dev/fd/<n> pour envoyer le résultat du processus entre parenthèses vers un autre processus. [1]
![]() | Il n'y a pas d'espace entre le << < >> ou << > >> et les parenthèses. Ici, un espace génèrerait un message d'erreur. |
bash$ echo >(true) /dev/fd/63 bash$ echo <(true) /dev/fd/63 |
cat <(ls -l) # Même chose que ls -l | cat sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin) # Liste tous les fichiers des trois principaux répertoires "bin", et les trie #+ par nom de fichier. # Notez que trois commandes distinctes (Comptez les !) vont "nourrir" 'sort'. diff <(command1) <(command2) # Fournit les différences entre les #+ sorties des commandes. tar cf >(bzip2 -c > file.tar.bz2) $nom_repertoire # Appelle "tar cf /dev/fd/?? $nom_repertoire" et "bzip2 -c > fichier.tar.bz2" # # A cause de la fonctionnalité système /dev/fd/<n>, # le tube entre les deux commandes n'a pas besoin d'être nommé. # # Ceci peut être émulé. # bzip2 -c < pipe > file.tar.bz2& tar cf pipe $nom_repertoire rm pipe # ou exec 3>&1 tar cf /dev/fd/4 $nom_repertoire 4>&1 >&3 3>&- | bzip2 -c > fichier.tar.bz2 3>&- exec 3>&- # Merci, S.C. |
Un lecteur de ce document a envoyé cet intéressant exemple de substitution de processus.
# Fragment de script provenant d'une distribution Suse: while read des what mask iface; do # Quelques commandes ... done < <(route -n) # Pour le tester, faisons lui faire quelque chose while read des what mask iface; do echo $des $what $mask $iface done < <(route -n) # Sortie: # Table de routage IP du noyau # Destination Gateway Genmask Flags Metric Ref Use Iface # 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo # Comme S.C. le souligne, un équivalent plus aisémment compréhensible est: route -n | while read des what mask iface; do # Les variables sont affectées par la #+ sortie du tube. echo $des $what $mask $iface done # Même sortie qu'au dessus. |
[1] | Ceci a le même effet qu'un tube nommé (fichier temporaire), et, en fait, les tubes nommés étaient autrefois utilisés dans les substitutions de processus. |
Précédent | Sommaire | Suivant |
Shells restreints | Niveau supérieur | Fonctions |