web-dev-qa-db-fra.com

Canaliser la sortie vers deux commandes différentes

Duplicata possible:
osx/linux: des tuyaux en deux processus?

Existe-t-il un moyen de diriger la sortie d'une commande vers l'entrée de deux autres commandes, en les exécutant simultanément?

Quelque chose comme ça:

$ echo 'test' |(cat) |(cat)
test
test

La raison pour laquelle je veux le faire est que j'ai un programme qui reçoit un signal radio FM d'un périphérique USB SDR et qui produit l'audio sous forme de données PCM brutes (comme un fichier .wav mais sans en-tête). Puisque le signal n'est pas la musique mais les données du pager POCSAG, j'ai besoin de le diriger vers un programme de décodeur pour récupérer le texte du pager. Cependant, je veux aussi écouter le signal, donc je sais si des données arrivent ou non. (Sinon, je ne peux pas dire si le décodeur est cassé ou s'il n'y a tout simplement pas de données diffusées.) Ainsi, en plus de canaliser les données vers le décodeur de pageur, j'ai également besoin de diriger les mêmes données vers la commande play .

Actuellement, je sais seulement comment en faire un - soit le diriger vers le décodeur et lire les données en silence, soit le diriger vers play et l'entendre sans voir de texte décodé.

Comment puis-je diriger les mêmes données vers les deux commandes, afin de pouvoir lire le texte et entendre l'audio?

Je ne peux pas utiliser tee car il écrit uniquement les données dupliquées dans un fichier, mais j'ai besoin de traiter les données en temps réel.

25
Malvineous

Cela devrait être correct si vous utilisez à la fois tee et mkfifo.

mkfifo pipe
cat pipe | (command 1) &
echo 'test' | tee pipe | (command 2)
31
Tim Green

Il existe un moyen de le faire via un canal sans nom (testé sous Linux):

 (( echo "hello" |
         tee /dev/fd/5 |
             sed 's/^/1st occure: /' >/dev/fd/4
    ) 5>&1 |
    sed 's/^/2nd command: /'
 ) 4>&1

donner:

2nd command: hello
1st occure: hello

Cet exemple vous permettra de télécharger somefile.ext, enregistrez-les, calculez son md5sum et calculez son sha1sum:

(( wget -O - http://somewhere.someland/somepath/somefile.ext |
    tee /dev/fd/5 |
    md5sum >/dev/fd/4
  ) 5>&1 |
  tee somefile.ext |
  sha1sum
) 4>&1
12
F. Hauri

Jetez peut-être un œil à la commande tee. Ce qu'il fait, c'est simplement imprimer son entrée dans un fichier, mais il imprime également son entrée sur la sortie standard. Donc quelque chose comme:

echo "Hello" | tee try.txt | <some_command>

Va créer un fichier avec le contenu "Bonjour" ET passera bonjour comme argument à <some_command>.