Je me demandais comment comprendre ce qui suit :
Transférer le stdout d'une commande dans le stdin d'une autre est une technique
puissante. Mais que se passe-t-il si vous avez besoin de diriger la sortie standard de plusieurs
commandes ? C'est là qu'intervient la substitution de processus.
En d'autres termes, la substitution de processus peut-elle faire tout ce que le tube peut faire ?
Qu'est-ce que la substitution de processus peut faire, mais pas le tube ?
Réponse acceptée :
Un bon moyen de comprendre la différence entre eux est de faire quelques expériences sur la ligne de commande. Malgré la similitude visuelle dans l'utilisation du <
caractère, il fait quelque chose de très différent d'une redirection ou d'un tube.
Utilisons la date
commande pour tester.
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
Ceci est un exemple inutile mais il montre que cat
accepté la sortie de date
sur STDIN et recrachez-le. Les mêmes résultats peuvent être obtenus par substitution de processus :
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
Cependant, ce qui vient de se passer dans les coulisses est différent. Au lieu de recevoir un flux STDIN, cat
a en fait reçu le nom d'un fichier dont il avait besoin pour être ouvert et lu. Vous pouvez voir cette étape en utilisant echo
au lieu de cat
.
$ echo <(date)
/proc/self/fd/11
Lorsque cat a reçu le nom du fichier, il a lu le contenu du fichier pour nous. D'un autre côté, echo nous a juste montré le nom du fichier qu'il a été passé. Cette différence devient plus évidente si vous ajoutez plus de substitutions :
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
Il est possible de combiner substitution de processus (qui génère un fichier) et redirection d'entrée (qui connecte un fichier à STDIN) :
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Cela semble à peu près le même, mais cette fois, cat a reçu le flux STDIN au lieu d'un nom de fichier. Vous pouvez le voir en l'essayant avec echo :
$ echo < <(date)
<blank>
Comme echo ne lit pas STDIN et qu'aucun argument n'a été passé, nous n'obtenons rien.
Les canaux et les redirections d'entrée poussent le contenu vers le flux STDIN. La substitution de processus exécute les commandes, enregistre leur sortie dans un fichier temporaire spécial, puis transmet ce nom de fichier à la place de la commande. Quelle que soit la commande que vous utilisez, elle est traitée comme un nom de fichier. Notez que le fichier créé n'est pas un fichier normal mais un canal nommé qui est automatiquement supprimé une fois qu'il n'est plus nécessaire.
Connexe :les événements filtrés dans Process Monitor sont-ils stockés en mémoire ou sur disque ?