Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[Résolu] Comment faire une double redirection de stdout


Messages recommandés

Posté(e) (modifié)

Bonjour

 

Je cherche une commande Linux 'standard' qui ferait une double redirection de la sortie standard dans 2 commandes

Je connais la commande tee qui redirige vers fichier et sortie standard.

J ai la solution de stocker ça dans un fichier texte temporaire puis d'exécuter les autres commandes sur ce fichier,

mais j'aimerai pour autant ne pas avoir a le faire.

J'aimerai également ne pas passer par des bidouilles consistants à jouer avec les arguments.

 

exemple :

 

cat toto.txt | tee fichier.txt | <<< redirection du pipe dans une autre commande >>>

 

Mon objectif est similaire mais plutot de cette forme

 

cat toto.txt | commande | <<< redirection du pipe dans une commande >>>

|__ <<< redirection du pipe dan
s
une autre commande >>>

 

J'aimerai aussi ne pas passer dans un script .

 

Merci

Modifié par elskwi

Posté(e)

on peut éventuellement jouer avec les tubes nommés

 

% cat > toto.txt
titi
tata
^D

% mkfifo pipe1
% (wc -m |read mot && echo nombre de mots: $mot) < pipe1 &
% cat toto.txt | tee pipe1 | wc -l | read ligne && echo nombre de lignes $ligne

 

mkfifo crée un tube nommé "pipe1"

 

(wc -m |read mot && echo nombre de mots: $mot) < pipe1 &

est une commande lancée en arrière plan qui va lire le tube FIFO pipe1 pour y compter le nombre de mots, attribuer le nombre à la variable $ mot et afficher le résultat

 

cat toto.txt | tee pipe1 | wc -l | read ligne && echo nombre de lignes $ligne

va lire le fichier toto.txt dans un tube qui redirige vers tee.

tee redirige lecontenu de toto.txt dans le tube FIFO pipe1 puis vers la commande wc -l qui compte le nombre de lignes, attribue ce nombre à la variable $ligne et affiche le résultat

 

//à noter que le caractère de fin de ligne \n compte pour un caractère; le script affichera donc

nombre de lignes 2
nombre de mots: 10

Posté(e)
Je cherche une commande Linux 'standard' qui ferait une double redirection de la sortie standard dans 2 commandes
Y'en a pas. Tu ne peux pas dupliquer un flux de sortie standard vers deux processus. Au pire (et au plus porc) tu peux peut-être tenter de rediriger ta sortie standard sur un prog "fait maison" qui copie la sortie standard sur la sortie d'erreur et rediriger chacune de ces sorties vers une commande différente mais c'est mal (stderr n'est pas fait pour ça) et j'ignore s'il est possible de rediriger stderr ailleurs que dans un fichier (i.e. en entrée standard d'un processus) !

 

Si vraiment ça te bloque de passer par un fichier temporaire, à moins de faire faire à l'une de tes commandes la même chose que tee (à savoir, traiter les données d'un côté pendant qu'on les ressort sur la sortie standard de l'autre) je ne vois pas comment tu pourrais faire...

 

On pourrait avoir un peu plus d'infos sur le genre de choses que tu comptes faire avec une telle pirouette ? Savoir pourquoi tu as impérativement besoin de tout faire en un coup...

Posté(e) (modifié)
Y'en a pas. Tu ne peux pas dupliquer un flux de sortie standard vers deux processus.

 

Alors déjà ... être aussi affirmatif... il faudrait d'abord voir de plutôt écrire: "Pas à ma connaissance, mais Linux sait tout faire, même faire bouger un pinguin par un port RS232". :P

De plus, je pense que ma question est assez claire pour ne pas avoir à expliquer le pourquoi du comment. Mais bon puisque tu es curieu(x|se) : Ce que je veux faire c est inliner mes commandes de parsing avec un générateur en Java (system.exec(blablabla)), dont le méta-modèle est dans un fichier XML, disons que dans l'hypothère où je ne peux pas les inliner ça me fait rajouter des instructions en plus.

La raison de tout ça... je fais un ldap-search par exemple, dans un cas je dois parser pour récupérer et formatter certaines infos, dans un autre cas, c'est pour d'autres informations. Pour des optiques de sécurité et de performances, je préfèrerais lancer la commande une seule fois.

Faire un méta-modèle, c'est compliqué, si le code peut être simple, c'est encore mieux.

 

1 - J ai appris qu'on pouvait faire ça, ce qui correspond carrément à ce que je cherche

la syntaxe est un peu tordu, mais ça marche.

En bash :

cat toto.txt | commande | tee <(cmd1) <(cmd2) |....

 

2 - la solution évoquée au dessus par Greywolf

est une super alternative à laquelle j'ai pensé. en bref

 

 

/// DEBUT COMMANDE

 

# Action 1 : Creation de deux pipes nommées

# mkpipe pipe1 p

# mkpipe pipe2 p . Erreur soulevée dans le post si dessous par kewlcat

mknod pipe1 p

mknod pipe2 p

 

# L'option p crée un fifo, ou plus simplement

# mkfifo pipe1

# mkfifo pipe2

 

# Action 2 : Connexion des parsers au pipe

parser1 pipe1 | etc | etc &

parser2 pipe2 | etc | etc &

 

(¯¯¯¯¯¯¯¯¯() <<=== parser1 | etc | etc &

 

(¯¯¯¯¯¯¯¯¯() <<=== parser2 | etc | etc &

 

# Les parsers ne sont pas actifs pour le moment car le pipe est vide ... ils sont mis en attente

 

# Action 3 : Remplir les pipes

commandes | tee pipe1 | pipe2, la commande tee fait une "fourche" du résultat de la commande

 

tee pipe1 ===> (¯¯¯¯¯¯¯¯¯() <<=== parser1 | etc | etc

 

tee pipe2 ===> (¯¯¯¯¯¯¯¯¯() <<=== parser2 | etc | etc

 

# les parsers sont alimentés car le pipe se remplit, ils vont pouvoir faire leur travail

# Action 2 et 3 peuvent être inversés. Dans ce cas là, les parsers interviendront directement lors de leur exécution.

 

/// FIN COMMANDES

 

Merci Greywolf pour ta réponse subtile et efficace. :P

 

PROBLEME RESOLU !

Modifié par elskwi
Posté(e)

OK. S'il ne faut pas être catégorique, alors tu me dis quelle est la commande Linux 'standard' qui fait une double redirection de la sortie standard dans 2 commandes s'il te plait ? tee ? C'est pas pour être méchant, mais tee fait une duplication de son entrée standard dans un fichier (ici, un pipe) donc on n'est plus dans le cas "deux processus, un unique flux" comme tu le demandais...

 

Je suis effectivement très curieux, parce que j'aime bien savoir ce que les gens ont derrière la tête quand ils posent des questions "étranges". Tu n'imagines pas le nombre de fois où on demande "comment on réinstalle Java" alors que le problème vient d'un problème de blocage de Javascript... La charrue avant les boeufs, tout ça...

 

Tu pars donc sur la solution "je mets deux parsers en attente de pipes lorsque je lance mon application et quand l'application fait un System.exec(" .... | tee pipe1 | tee pipe2") j'obtiens mes deux parsings comme je le voulais" ?

Au passage, ton Action1 c'est pas plutôt "mkfifo ..." au lieu de "mkpipe ..." ? Et pourrais-tu expliquer la syntaxe du point 1- (concernant le | commande | tee <(cmd1) <(cmd2)| ...) en donnant un exemple concret ?

Posté(e) (modifié)
Au passage, ton Action1 c'est pas plutôt "mkfifo ..." au lieu de "mkpipe ..." ?

Effectivement, je me suis trompé.

c'est mknod name p que je voulais mettre, Qui crée justement un fifo.

Je corrige ça dans le post.

 

Tu pars donc sur la solution "je mets deux parsers en attente de pipes lorsque je lance mon application et quand l'application fait un System.exec(" .... | tee pipe1 | tee pipe2") j'obtiens mes deux parsings comme je le voulais" ?

C'est un solution très interessants en effet, Le truc c'est que je dois utiliser au maximum des commandes 'Linux' et il est exclus par ceux qui maintiendront le système de devoir écrire les parsers en script (perl, shell ...)

 

Pour te donner un aperçu, une partie du modèle correspond à ça

 

<associated attribute="user" card="1-N" lastcommand="false">
	<command>ldap-search etc etc etc</command>
	<parser>parser1</parser>
	<parser>parserN</parser>
	<associated name="group" attribute="user" card="1-N" lastcommand="true">
		<parser>parsergroupe1</parser>
		<parser>parsergroupeN</parser>
	</associated>	
</associated>

L'attribut lastcommand="true" indique que l'on doit utiliser le résultat de la dernière commande passée et lui appliquer les parsers "parsergroupe1" à "parsergroupeN".

Ce modèle me permet de générer dynamiquement des tables sql et les relations, de les remplir à la volée.

Je suis encore en analyse/conception et ce modèle n'est pas encore fini.

Modifié par elskwi
  • Tonton a modifié le titre en [Résolu] Comment faire une double redirection de stdout

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...