![Führen Sie ein Bash-Skript von einem anderen Skript aus aus und leiten Sie dessen Ausgabe um](https://rvso.com/image/1047584/F%C3%BChren%20Sie%20ein%20Bash-Skript%20von%20einem%20anderen%20Skript%20aus%20aus%20und%20leiten%20Sie%20dessen%20Ausgabe%20um.png)
Hallo zusammen, ich muss ein Programm erstellen. Ich werde es ganz kurz und knapp erklären. Und was ich bereits getan habe und was ich noch tun muss …
Ich muss einfach einen „Simulator“ in Bash erstellen, der die Übungen der Studenten ausführt und prüft, ob sie richtig sind. Für jede Übung muss ich eine Punktzahl berechnen und mitteilen, ob der Student die Prüfung bestanden hat oder nicht.
Ich habe fast alles gemacht... Ich glaube, mir fehlen nur noch ein paar Codezeilen, die ich schreiben muss... aber ich glaube auch, dass das die wichtigsten sind... :(
Mein Skript ist TEST.SH und ich muss die Übung des Studenten ausführen. Die Übung ist ein Skript ELABORATO.SH. Nun kann ich einige Szenarien haben:
- ELABORATO.SH erwartet in der Eingabe als Parameter einige Werte;
- ELABORATO.SH wartet auf Eingaben von stdin, von der Tastatur;
- ELABORATO.SH schreibt die Ausgabe in eine Datei/ein FIFO/usw.;
Der erste Punkt ist wirklich einfach zu lösen. Tatsächlich rufe ich von meinem TEST.SH aus
ELABORATO.SH
folgendermaßen auf:. ELABORATO.SH param1 param2 param3;
Zweitens und drittens: Es ist für mich komplizierter.
Ich muss einen String aus einer Datei lesen (und das ist ok) und diesen String so übergeben,
ELABORATO.SH
als käme der String von stdin.Ich muss eine Datei mit der Ausgabe von
ELABORATO.SH
… erstellen. Wenn ich also beispielsweiseELABORATO.SH
eine Datei erstelle (ich kenne den Namen der Ausgabedatei nicht), muss ich auch eine Datei in einem anderen Verzeichnis erstellen … Wie kann ich das machen?
Antwort1
Das klingt verdächtig nach einer Hausaufgabe*, aber los geht’s.
Warum sollten Sie das
ELABORATO.SH
Skript als Quelle verwenden? Wenn Sie das tun und es eineexit
Anweisung oder Fehler enthält,TEST.SH
tut Ihr Skript dasselbe. Ich glaube nicht, dass Sie das wollen. Ich würde einfach das Skript ausführen:bash ELABORATO.SH param1 param2
Haben Sie darüber nachgedacht, die Eingabe umzuleiten?
bash ELABORATO.SH param1 param2 < INPUT_FILE
Um die Ausgabe von zu erfassen
ELABORATO.SH
, nun, ist die Umleitung nicht einfachgemachtdafür?bash ELABORATO.SH param1 param2 < INPUT_FILE > OUTPUT_FILE
Herauszufinden, welche Dateien ELABORATO.SH
geschrieben werden, ist nicht trivial. (Nebenbemerkung: Wenn Sie die Ausgabedateien nicht kennen, wie können sie dann für die Berechnung des Scores von relevant sein ELABORATO.SH
? Warum sollten Sie sie überhaupt verschieben?)
Wie dem auch sei, los geht’s. Die folgende Pipeline listet die von erstellten Dateien auf ELABORATO.SH
:
strace bash ELABORATO.SH params < INPUT_FILE 2>&1 > OUTPUT_FILE \
| grep '^open(.*O_CREAT' | cut -d\" -f 2
Um sie dann an einen anderen Ort zu verschieben, können Sie Folgendes tun:
for f in $(
strace bash ELABORATO.SH params < INPUT_FILE 2>&1 > OUTPUT_FILE
| grep '^open(.*O_CREAT' | cut -d\" -f 2)
do
mv "$f" /path/to/elsewhere
done
*) Bitte empfehlen Sie Ihrem Vorgesetzten die freundlichen Leute von AskUbuntu.