Bidirektionale Pipe: Kommunikation zwischen zwei Programmen über Dateideskriptoren
Hallo, Leute!
Ich würde gerne einen möglichst einfachen Befehl haben, mit Hilfe dessen zwei Programme miteinander kommunizieren können. Ein simples Beispiel sind die nachfolgenden Programme 1 und 2:
Code:
#!/usr/bin/awk -f
#BEGIN{
#print 0.3;
#fflush();
#}
{
print $1+1;
fflush();
}
und
Code:
#!/usr/bin/awk -f
($1 > 100) {exit 0;}
{
print $1*10;
fflush();
}
Für die, die des awk nicht mächtig sind: Programm 1 liest den ersten Wert einer Zeile ein und gibt Wert+1 aus, Programm 2 gibt Wert*10 aus und bricht bei 100 ab.
Mit Fifos ist das ganz einfach:
Code:
mkfifo in
<in ./1.awk | ./2.awk >in &
echo 0.3 > in
Den echo-Befehl kann (sollte) man dabei weglassen, wenn in Programm 1 der BEGIN-Block nicht ausgeklammert ist. Die Kommunikation ist dann
Code:
0.3
1.3
13
14
140
141
Soweit, so gut. Meine Frage ist nun, wie man das Ganze ohne so eine temporäre Fifodatei hinbekommt. Mein Ansatz war
Code:
exec 3<>/dev/null
<&3 ./1.awk | ./2.awk >&3
Hier ist der BEGIN-Block also eingeklammert. Aber es klappt so oder so nicht. Hat da jemand eine schöne Lösung parat? Geht’s vielleicht auch mit den Standarddeskriptoren 0 und 1? Und kann man die Kommunikation von außen vielleicht so anstoßen wie im obigen Fifo-Beispiel?
Eigentlich kann das doch nicht so schwer sein, aber ich habe schon viel im Netz gesucht …
Dann noch einen guten Rutsch,
Frank