GNU/Linux >> Tutoriels Linux >  >> Linux

Substitution de processus et tuyau ?

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 ?
Linux
  1. Un superbloc, un inode, un dentry et un fichier ?

  2. Autorisations de fichiers et sauvegarde ?

  3. Rediriger et canaliser la sortie ?

  4. Installation et configuration de vsFTPD

  5. Modifier la date de création du fichier

Comment obtenir la date et l'heure actuelles en Python

Fichiers d'inventaire et de configuration Ansible

Comment définir la date et l'heure sous Linux

Pourquoi la substitution de processus Bash ne fonctionne-t-elle pas avec certaines commandes ?

Stocker la sortie de la commande date et watch dans un fichier

Reformater l'horodatage dans un fichier délimité par des canaux