Führen Sie ein Bash-Skript von einem anderen Skript aus aus und leiten Sie dessen Ausgabe um

Führen Sie ein Bash-Skript von einem anderen Skript aus aus und leiten Sie dessen Ausgabe um

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:

  1. ELABORATO.SH erwartet in der Eingabe als Parameter einige Werte;
  2. ELABORATO.SH wartet auf Eingaben von stdin, von der Tastatur;
  3. ELABORATO.SH schreibt die Ausgabe in eine Datei/ein FIFO/usw.;

  1. Der erste Punkt ist wirklich einfach zu lösen. Tatsächlich rufe ich von meinem TEST.SH aus ELABORATO.SHfolgendermaßen auf:

    . ELABORATO.SH param1 param2 param3;
    

    Zweitens und drittens: Es ist für mich komplizierter.

  2. Ich muss einen String aus einer Datei lesen (und das ist ok) und diesen String so übergeben, ELABORATO.SHals käme der String von stdin.

  3. Ich muss eine Datei mit der Ausgabe von ELABORATO.SH… erstellen. Wenn ich also beispielsweise ELABORATO.SHeine 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.

  1. Warum sollten Sie das ELABORATO.SHSkript als Quelle verwenden? Wenn Sie das tun und es eine exitAnweisung oder Fehler enthält, TEST.SHtut Ihr Skript dasselbe. Ich glaube nicht, dass Sie das wollen. Ich würde einfach das Skript ausführen:

    bash ELABORATO.SH param1 param2
    
  2. Haben Sie darüber nachgedacht, die Eingabe umzuleiten?

    bash ELABORATO.SH param1 param2 < INPUT_FILE
    
  3. 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.SHgeschrieben 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.

verwandte Informationen