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 |