Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[shell] dupliquer stdout ?
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
TTK
Guru
Guru


Joined: 02 Mar 2004
Posts: 523

PostPosted: Wed Jan 05, 2005 9:06 pm    Post subject: [shell] dupliquer stdout ? Reply with quote

Salut

Je cherche un moyen de rediriger la sortie standard d'une commande vers 2 autres commandes. En fait, il faudrait une sorte de tee mais qui redirige vers une commande et non un fichier.
Genre: cat gros_fichier | tee 'filtre1' | filtre2

Je suis pas sur d'être tres clair là .. :roll:
Merci
Back to top
View user's profile Send private message
Trevoke
Advocate
Advocate


Joined: 04 Sep 2004
Posts: 4099
Location: NY, NY

PostPosted: Wed Jan 05, 2005 9:20 pm    Post subject: Reply with quote

Euh... redirige vers un fichier et ensuite utilise ce fichier comme input pour les deux filtres?
Tu veux utiliser le deuxieme filtre sur l'output du premier? Dans ce cas une double pipe devrait suffire (en tout cas, apres ca moi je suis rompu, har har).
Si tu veux utiliser les deux filtres separement, alors je sens venir un mini shell script.. Ou alors deux commandes separees.
_________________
Votre moment detente
What is the nature of conflict?
Back to top
View user's profile Send private message
sireyessire
Advocate
Advocate


Joined: 20 Mar 2003
Posts: 2991
Location: back in Paris, France

PostPosted: Wed Jan 05, 2005 9:21 pm    Post subject: Reply with quote

je suppose que ces 2 commandes doivent être éxécutés en parallèle et pas en série, ou j'ai rien compris?
_________________
I never think of the future. It comes soon enough.
Albert Einstein

Try simpler first
Shockley
Back to top
View user's profile Send private message
TTK
Guru
Guru


Joined: 02 Mar 2004
Posts: 523

PostPosted: Wed Jan 05, 2005 9:37 pm    Post subject: Reply with quote

Oui, il faut bien executer ces commandes en parallele. Le but est de ne lire le fichier qu'une fois.

L'exemple typique ct quand je faisais:
Code:

cat *.VOB | tcextract -x mpg -t vob > truc.m2v
cat *.VOB | tcextract -x ac3 -a 1 -t vob > truc.ac3
mplex truc.mpg truc.m2v truc.ac3


Et ce pb m'arrive souvent. Là c'est un peu plus tortueux, mais l'idée est la même. 2 traitements en parallele sur un fichier. J'ai pas envie de faire un script perl. Mon fichier est binaire en plus.

Bye
Back to top
View user's profile Send private message
xaviermiller
Bodhisattva
Bodhisattva


Joined: 23 Jul 2004
Posts: 8710
Location: ~Brussels - Belgique

PostPosted: Thu Jan 06, 2005 8:32 pm    Post subject: Reply with quote

et tee ?
_________________
Kind regards,
Xavier Miller
Back to top
View user's profile Send private message
Trevoke
Advocate
Advocate


Joined: 04 Sep 2004
Posts: 4099
Location: NY, NY

PostPosted: Thu Jan 06, 2005 9:09 pm    Post subject: Reply with quote

man tee
info coreutils tee

(juste au cas ou, faut dire qu'il est pas clair le monsieur ) :)
_________________
Votre moment detente
What is the nature of conflict?
Back to top
View user's profile Send private message
Pachacamac
Veteran
Veteran


Joined: 22 Nov 2003
Posts: 1264
Location: Paris - France

PostPosted: Thu Jan 06, 2005 9:12 pm    Post subject: Reply with quote

Quote:
Mon fichier est binaire en plus.


C'est à dire ?

avec le C tu as fork() pour dupliquer les processus.
Back to top
View user's profile Send private message
TTK
Guru
Guru


Joined: 02 Mar 2004
Posts: 523

PostPosted: Thu Jan 06, 2005 11:32 pm    Post subject: Reply with quote

XavierMiller wrote:
et tee ?


Ben comme je disais dans mon premier post, c'est un genre de tee que je recherche, ou une syntaxe magique pour tee. Parce que tee ne sait rediriger que vers un fichier.

Peut etre avec un coprocess ? Je lance un filtre en coprocess, puis mon cat pipé sur un tee vers le dev correspondant au stdin de mon coprocess en attente de données ?

Qqun a une idee de syntaxe pour tout ca ?
Back to top
View user's profile Send private message
gim
Guru
Guru


Joined: 29 Apr 2003
Posts: 418
Location: milky-way

PostPosted: Fri Jan 07, 2005 2:54 am    Post subject: Reply with quote

Quote:
Qqun a une idee de syntaxe pour tout ca ?


J'ai essayé de trouver, mais les shells sont vraiments trop mal faits....
Alors j'ai fait une commande en C (dup.c):

Code:
#include <sys/types.h>
#include <unistd.h>

char *buf[1024];
int pipe1[2], pipe2[2];

int main (int argc, char *argv[])
{
  int s;
  pid_t p1, p2;

  if (argc != 3) {
    printf("usage: %s filtre1 filtre2\n", argv[0]);
    return 1;
  }

  pipe(pipe1); pipe(pipe2);

  if ((p1 = fork ()) == 0) {
    close(pipe2[0]); close(pipe2[1]);
    close(pipe1[1]);
    close(0); dup2(pipe1[0],0); close(pipe1[0]);
    execl("/bin/sh", "/bin/sh","-c",argv[1]);
  }
  else if ((p2 = fork ()) == 0) {
    close(pipe1[0]); close(pipe1[1]);
    close(pipe2[1]);
    close(0); dup2(pipe2[0],0); close(pipe2[0]);
    execl("/bin/sh", "/bin/sh","-c",argv[2]);
  }
  else {
    close(pipe1[0]); close(pipe2[0]);
    while((s = read(0,buf,1024)) != 0)
      {
   write (pipe1[1],buf,s);
   write (pipe2[1],buf,s);
      }
    close(pipe1[1]); close(pipe2[1]);
    waitpid(p1,0,0); waitpid(p2,0,0);
  }
  return 0;
}

J'améliorerai ça un autre jour :)

Un petit coup de gcc dup.c -o dup et hop:

Code:
$ dup
usage: dup filtre1 filtre2

les filtres sont interprétés par /bin/sh.

par exemple:
Code:
$ echo $(seq 0 9) | dup  'cat' 'rev | tr 0-9 A-Z'

les deux filtres sont executés en parallèle et leurs sorties standard entrelacées:
Code:
$ dup  'yes 1' 'yes 2'


++
Back to top
View user's profile Send private message
TTK
Guru
Guru


Joined: 02 Mar 2004
Posts: 523

PostPosted: Fri Jan 07, 2005 7:52 am    Post subject: Reply with quote

Ah bah ça c'est sympa. Merci !
En plus ça marche. Ptet que je vais augmenter le buffer parce que mon fichier d'entrée fait 500 megs ...
L'aviation civile te remercie de ta contribution à l'automatisation de l'analyse des statistiques de trafic aérien en RP ;)

Tshaw
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum