2016-07-16 31 views
1

den folgenden einfachen interaktiven Shell-Skript:Rohr stdout einen interaktiven Skript seine eigenen stdin

# tool.sh 
echo "Good Morning." 
echo "My Name is Mr. Sunshine, I am 100 years old." 
echo 
echo "So, what's your name?" 
read name; 
echo "and, whats' your age?" 
read age; 
echo $name, $age years old > output.txt 

Sag mal, dieses Skript jetzt durch ein anderes Skript programmatisch ausgeführt werden soll. Es ist so einfach wie folgt:

echo -e "Anton\n28" | bash tools.sh 

und voilà, output.txt enthält "Anton, 28 Jahre alt" jetzt.

Der schwierige Teil kommt jetzt: Ich möchte "Mr. Sunshine, 100 Jahre alt" in der output.txt sehen, mit nur dem Öffnen des Werkzeugs einmal.

Das Problem hier ist die Einstellung eines Rohres, das die Ausgabe der Werkzeuge analysiert und Teile direkt an seinen Eingang sendet.

sed -nr 's/^My Name is (.*), I am (.*) years old\.$/\1\t\2/p' 
+0

Ich verstehe nicht ganz, was Sie wollen. * Ich möchte "Mr. Sunshine, 100 Jahre alt" in der output.txt sehen, indem ich das Tool nur einmal öffne. * 'Echo -e" Mr. Sunshine \ n100 "| bash tools.sh' öffnet "tools.sh" nur einmal und das gewünschte Ergebnis wird in "output.txt" geschrieben. Ihre 'sed'-Zeile sieht so aus, als ob Sie' output.txt' lesen und sie Ihrem Skript zuführen möchten. Ist das was du willst? – mhoff

+0

Die Code-Zeile, die Sie vorschlagen, würde das Ding tun, aber in dem Szenario würden Sie jetzt nicht die Werte "Mr. Sonnenschein 'und' 100 'vorher. Mit der sed line will ich nicht output.txt parsen sondern die Ausgabe der ersten Zeilen von tool.sh –

+0

Danke für die Klarstellung. Das ist eine sehr interessante Frage. – mhoff

Antwort

1

Sie können für diese verwenden Named Pipes:

Die Analyse könnte wie folgt durchgeführt werden.

Ein Named Pipe ist im Grunde eine Datei, aus der man synchron lesen und schreiben kann. Um die Ausgabe eines Werkzeugs dem Werkzeug selbst als Eingabe zuzuführen, kann eine Named Pipe zum Herstellen dieser kreisförmigen Verbindung verwendet werden.

+0

Das funktioniert perfekt. Ich denke, der letzte Schritt innerhalb der wrapper.sh wird nicht benötigt (> tools_pipe). Ich schätze, ein Tippfehler. Ich frage mich immer noch, warum du eigentlich im Wrapper lesen musst? Sowie es funktioniert auch sed emittiert eine Tab-getrennte Zeichenfolge (keine neuen Zeilen). –

+0

Das ist ein Tippfehler, ja. Ich werde es entfernen. Nun, du musst die Eingabe irgendwie verarbeiten. Es gibt natürlich andere Möglichkeiten, mit dieser Anforderung umzugehen. Ich habe versucht, 'cat tools_pipe | ./tools.sh | sed -rnu's/Mein Name ist (. *), ich bin (. *) Jahre alt \ ./ \ 1 \ t \ 2/p '> tools_pipe', um zu funktionieren, aber bash verhält sich in diesem Fall seltsam. – mhoff

+1

Ich habe gerade herausgefunden: Wechsel \ t zu \ n im Einzeiler und es funktioniert .. –