Un bon moyen de faire la différence est de faire quelques essais sur la ligne de commande. Malgré la similarité visuelle dans l'utilisation du <
personnage, il fait quelque chose de très différent d'une redirection ou d'un pipe.
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
la sortie de date
STDIN a été acceptée et renvoyée. 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 était différent. Au lieu de recevoir un flux STDIN, cat
le nom du fichier qu’il devait ouvrir et lire a été transmis. Vous pouvez voir cette étape en utilisant à la echo
place de cat
.
$ echo <(date)
/proc/self/fd/11
Lorsque chat reçoit le nom du fichier, il lit le contenu du fichier pour nous. D'autre part, echo nous a juste montré le nom du fichier qu'il a été transmis. 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 la substitution de processus (qui génère un fichier) et la redirection des entrées (qui connecte un fichier à STDIN):
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Il semble à peu près la même chose, mais cette fois, le chat a été passé 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 ne recevons rien.
Les pipes et les redirections d'entrée transfèrent le contenu sur 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 la traite comme un nom de fichier. Notez que le fichier créé n'est pas un fichier normal, mais un canal nommé qui est automatiquement supprimé dès qu'il n'est plus nécessaire.