``Y-Pipe''

Post Reply
Message
Author
bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

``Y-Pipe''

#1 Post by bakunin »

Hi!

Um stdout und stderr in separate Kommandos zu pipen, verwendet man:

(programm | stdout-verarbeitung >/dev/tty 2>&1) 2>&1 | stderr-verarbeitung

Allerdings wollte ich dafür nun eine Funktion einrichten, damit man es so verwenden kann:

ypipe "programm" "stdout-verarbeitung" "stderr-verarbeitung"

Ich habe das nun so implementiert:

ypipe ()
{
($1 | $2 >/dev/tty 2>&1) 2>&1 | $3
}

Hierbei wurden die Variablen ganz bewusst nicht gequotet, damit das jeweils angegebene Kommando ausgeführt wird. das funktioniert bei einfachen Kommandos, aber wenn ich für $2 z.B. so etwas wie "(echo foo; cat)" angebe (beim Aufruf mit den ""), ist das Resultat die Meldung, dass das Kommando "(echo" nicht gefunden werden konnte. Es von Hand in das große Konstrukt einzufügen, funktioniert hingegen.

Mich interessiert gar nicht so sehr, wie ich das zum Laufen kriege, sondern umso mehr, warum es nicht funktioniert wie erwartet.

Cheers,
GNU/Wolfgang

PS: GNU bash, version 2.03.0(1)-release (i386-pc-linux-gnu)

arni

Re: ``Y-Pipe''

#2 Post by arni »

Hast du mal eval probiert?

ypipe ()
{
( eval $1 | eval $2 >/dev/tty 2>&1) 2>&1 | $3
}

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: ``Y-Pipe''

#3 Post by bakunin »

Hi!

Aha, wenn man vor das $3 dann noch ein eval schreibt, sacheint es perfekt zu funktionieren. Danke, Arni. :)

Cheers,
GNU/Wolfgang

Jochen

Re: ``Y-Pipe''

#4 Post by Jochen »

Hi Wolfgang,

<i>das</i> Konstrukt (Beispiel aus dem Start-Posting) ist mir vollkommen unbekannt gewesen. Wieder was gelernt, nur stecke ich jetzt in der Klemme, dass ich nicht weiss, <i>wieso</i> es funktioniert. Soweit ich es bis jetzt kapiert habe:

1. Die Shell setzt eine Subshell auf wg. der runden Klammern. Deren stderr geht an stdout und damit über Pipe an das Kommando zur "stderr-verarbeitung". Sämtliche stderrs der in den runden Klammern eingeschlossenen Kommandos sollten dort aufschlagen, wenn nicht eine explizite Umlenkung vorgenommen wird.

2. In der Subshell läuft "programm" an, dessen stdout ganz normal über Pipe an "stdout-verarbeitung" weitergegeben wird. Alle stderr-Meldungen von "programm" zappeln über die Subshell-Umleitung nach "stderr-verarbeitung". Ahhh.... Das was der Punkt, glaube ich...

3. "stdout-verarbeitung" lenkt seine stdout ans tty und sein stderr dahin, wohin stdin schon zeigt, also auch /dev/tty. Keine seiner Ausgaben stören damit "stderr-verarbeitung".

Ja, jetzt ist es klar. Danke für's Zuhören, Wolfgang! <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> Manchmal muss ich so Sachen jemanden erklären, um es selbst zu verstehen. Da es noch jemand nützen könnte, lasse ich es mal stehen.

Jochen

Post Reply