2017-05-10 3 views
4

Je voudrais quelque chose qui fonctionne comme:Existe-t-il un moyen de diffuser un flux dans Posix Shell ou bash?

cat a > b 
prog1 < b 
prog2 < b 

sans avoir à créer le fichier temporaire b.

Si je viens d'avoir un programme, je pourrais utiliser un tuyau:

cat a | prog1 

Je me demande si un shell a la syntaxe pour soutenir quelque chose comme:

cat a (|prog1) (|prog2) 

Ou est-il une pratique utilité qui peut aider? Quelque chose comme:

cat a | fanout prog1 prog2 

Répondre

6

Vous pouvez utiliser une fourchette tee + process substitution un flux de données et l'envoyer à plusieurs processus.

cat a | tee >(prog1) | prog2 

tee prend les noms de fichiers en tant que paramètres. >(prog1) est remplacé par un nom de fichier comme /dev/fd/63 que tee peut écrire.

Pour écrire à plus de deux programmes, ajouter des substitutions de processus:

cat a | tee >(prog1) >(prog2) >(prog3) | prog4 
+0

'T> (prog1)> (prog2)> (PROG3) codeforester

+0

@codeforester: Je pense qu'il est prudent de supposer que 'cat a' est juste une commande _example_, donc dans le cas général vous avez besoin d'un pipeline (ou d'une substitution de processus _input_). – mklement0

+1

Vous devez utiliser 'cat a | tee> (prog1)> (prog2)>/dev/null', sinon la sortie de 'prog1' sera aussi envoyée à' prog2' - essayez 'echo hi | tee> (tr 'h' '@') | chat -n'. Cependant, vous obtenez un comportement de sortie asynchrone imprévisible et les processus d'arrière-plan ne sont peut-être pas encore terminés lorsque la commande suivante est exécutée. Voir [cette réponse] (http://stackoverflow.com/a/43906764/45375) du mien. – mklement0