Ich verwende ein interaktives Befehlszeilenprogramm in einem Linux-Terminal, auf dem die Bash-Shell läuft. Ich habe eine bestimmte Befehlsfolge, die ich in das Shell-Programm eingegeben habe. Das Programm schreibt seine Ausgabe auf die Standardausgabe. Einer dieser Befehle ist ein 'Speichern' Befehl, der die Ausgabe des vorherigen Befehls, der ausgeführt wurde, in eine Datei auf Platte schreibt.
Ein typischer Zyklus ist:
%Vor%Wie kann ich diesen Prozess automatisieren? Ich möchte ein Shell-Skript schreiben, das dieses Programm starten kann, und durch die einzelnen Schritte blättern, die Befehle nacheinander eingeben und dann beenden. Ich hoffe, dass der Befehl save korrekt funktioniert.
Wenn es Ihrem Befehl egal ist, wie schnell Sie ihn eingeben, und Sie nicht wirklich damit interagieren müssen , dann können Sie ein heredoc verwenden.
Beispiel:
%Vor%Wenn Sie eine Verzweigung basierend auf der Ausgabe des Programms benötigen oder wenn Ihr Programm überhaupt empfindlich auf das Timing Ihrer Befehle reagiert, dann ist Expect das, was Sie wollen.
Wo es nötig ist, gibt es einen Weg! Ich denke, es ist eine gute Bash-Lektion zu sehen Wie Prozessmanagement und IPC funktioniert. Die beste Lösung ist natürlich Expect. Aber der wahre Grund ist, dass Pipes knifflig sein können und viele Befehle entworfen werden um auf Daten zu warten, was bedeutet, dass der Prozess aus Gründen ein Zombie wird Bucht ist schwer vorherzusagen. Aber zu lernen, wie und warum uns daran erinnert, was ist weiter unter der Haube.
Wenn zwei Prozesse in eine Konversation eingreifen, besteht die Gefahr, dass einer oder beide es tun versuchen Sie, Daten zu lesen, die niemals ankommen werden. Die Regeln des Engagements müssen sein Kristallklar. Dinge wie CRLF und Zeichencodierung können die Party töten. Zum Glück sind zwei enge Partner wie ein Bash-Skript und dessen Kindprozess relativ einfach in der Linie zu halten. Die einfachste Sache zu verpassen ist, dass Bash ist einen Kinderprozess für fast alles, was es tut, zu starten. Wenn du es schaffen kannst arbeite mit bash, du weißt genau, was du tust.
Der Punkt ist, dass wir mit einem anderen Prozess sprechen wollen. Hier ist ein Server:
%Vor%Nun, das Skript, das hoffentlich die Magie macht.
%Vor%Beachten Sie, dass wir nicht einfach die SMTP-Befehle auf dem Server ablegen. Wir überprüfen jeder Antwortcode, um sicherzustellen, dass die Dinge in Ordnung sind. In diesem Fall werden die Dinge nicht sein OK und das Skript wird abbrechen.
Ich verwende Expect, um mit der Shell für Switch- und Router-Backups zu interagieren. Ein Bash-Skript ruft das expect-Skript mit den richtigen Variablen auf.
für ich in; tue expect_script.sh $ i; Beenden
Dies wird für jede Box ssh, führen Sie die Backup-Befehle aus, kopieren Sie die entsprechenden Dateien und gehen Sie dann zur nächsten Box.