Désolé si c'est une question idiote mais j'essaie d'accomplir quelque chose comme ça mais sur une seule ligne:
$ prog1 | prog2
$ prog1 | prog3
Donc, je veux essentiellement exécuter prog1 et diriger la sortie vers prog2 et prog3 séparément (pas un canal chaîné). Au début, j'essayais d'utiliser tee, mais cela ne me semblait pas correct car il vidait la sortie dans un fichier (ce qui n'est pas ce que je veux).
$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"
À un moment donné, je voudrais probablement étendre cela à la canalisation de la sortie vers plus de deux programmes, mais je commence simplement pour l'instant.
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
Réponses:
Substitution de processus.
la source
Semblable à la réponse d'Ignacio, vous pouvez utiliser un canal nommé temporaire à l'aide de
mkfifo(1)
.C'est un peu plus détaillé, mais cela fonctionnerait sur des systèmes qui n'ont pas de substitution de processus, comme
dash
. Ilsleep 1
s'agit de gérer toutes les conditions de course.la source
Il y a un petit utilitaire PTEE qui fait le travail:
Au lieu d'écrire dans des fichiers, ptee écrit dans tous les fds indiqués sur la ligne de commande.
ptee fait partie de pipexec .
la source
Vous n'avez pas besoin de bashismes ou de fichiers spéciaux ou de tout cela - pas sous Linux de toute façon:
J'ai mis en vedette les résultats
grep
mis en évidence pour moi pour montrer qu'ils n'étaient pas seulement trois résultats du même flux, mais ils étaient également le résultat degrep
correspondances de processus distinctes .la source