GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Automatisieren der Texteingabe aus einem Bash-Skript ohne Verwendung von EOF

Für fast alle Programme sind sowohl echo $i | myprogram -options und myprogram -options <<<$i sollte funktionieren, indem man das Programm mit $i füttert über die Standardeingabe.

<foo verwendet den Inhalt der Datei namens foo als stdin.

<<foo verwendet den Text zwischen diesem und einer Zeile, die nur aus foo besteht als Standardeingabe. Dies ist ein Hier-Dokument (Heredoc), wie Gilles sagte; EOF bedeutet nicht wirklich das Ende der Datei, es ist nur ein üblicher Heredoc-Begrenzer (in diesem Beispiel verwenden wir stattdessen "foo").

<<<foo verwendet die Zeichenfolge "foo" als Standardeingabe. Sie können auch eine Variable $foo angeben , und die Shell verwendet ihren Inhalt als stdin, wie ich oben gezeigt habe. Dies wird als Herestring bezeichnet , da es eine kurze Zeichenfolge im Gegensatz zu einem ganzen Block verwendet, wie in einem Heredoc. Herestrings funktionieren in bash, aber nicht in /bin/sh .


Die von dieser Website empfohlene Syntax wird als Here-Dokument bezeichnet. Die Eingabe in das Dateiprogramm beginnt unmittelbar unterhalb der Zeile mit <<EOF , und es wird nicht durch das Ende des Skripts beendet, sondern durch eine Zeile, die genau den Text EOF enthält (Achten Sie darauf, keine zusätzlichen Leerzeichen zu haben). Übrigens können Sie jeden Endmarker verwenden, der kein Shell-Sonderzeichen enthält:EOF ist kein Schlüsselwort, sondern lediglich traditionell.

#!/bin/bash
for i in {1..100}
do
   myprogram -options <<EOF
$i
EOF
   for j in {1..42}; do
     myprogram2 <<EOF
$i
$j
EOF
   done
done

hier Dokumente, wie oben von Kevin und Gilles erwähnt, oder einfache Rohrleitungen werden in vielen Fällen funktionieren.

Für kompliziertere Situationen sollten Sie sich Expect oder ähnliches ansehen (z. B. das Expect::Simple CPAN-Modul ist eine sehr einfach zu verwendende Perl-Implementierung). Ich persönlich bevorzuge das Perl-Modul (Expect selbst ist tcl), aber es gibt Implementierungen für viele gängige Skriptsprachen. Es ist sogar möglich, ein sehr zu schreiben primitive Implementierung der Idee in sh oder bash mit while und read.

Die allgemeine Idee von Expect und ähnlichen Tools besteht darin, auf eine bestimmte Zeichenfolge oder ein bestimmtes Muster in der Ausgabe eines Programms zu warten und es dann mit der gewünschten Eingabe zu füttern.

Ein gängiges Anwendungsbeispiel ist die Automatisierung der Anmeldung, indem die Zeichenfolge „ogin:“ „erwartet“ (d. h. darauf gewartet wird), der Anmeldename gesendet wird, dann die Zeichenfolge „word:“ erwartet und das Passwort gesendet wird.

Eine letzte Option, wenn Sie die Quelle von myprogram haben, besteht darin, sie einfach zu ändern, um die Eingabe zu übernehmen, die Sie ihr als Befehlszeilenoption geben möchten. Das mag im Vorfeld etwas mehr Arbeit bedeuten, ist aber viel weniger ärgerlich, als mit Expect herumzuspielen oder Daten in ein Programm zu leiten, das nicht für diese Verwendung konzipiert wurde.

... und vergiss nicht, deinen Patch wieder upstream an myprogram zu senden :) Auch wenn ihnen die Art und Weise, wie du ihn codiert hast, nicht gefällt, mag ihnen die Idee vielleicht genug, um das Feature selbst hinzuzufügen. Upstream-Entwickler neigen dazu, Leute zu schätzen, die sich erheben und etwas beitragen, anstatt zu fordern oder sich zu beschweren.


Linux
  1. Verhindern, dass ein Bash-Skript gleichzeitig ausgeführt wird

  2. In Bash-Skript zur/von der Zwischenablage leiten

  3. Automatisierung der Telnet-Sitzung mit Bash-Skripten

  4. atomare Erstellungsdatei, falls nicht aus dem Bash-Skript vorhanden

  5. Übertragen Sie Dateien mit lftp im Bash-Skript

Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner?

Vollständigen Pfad aus Bash-Skript abrufen?

Bash-Skript - So lesen Sie Benutzereingaben

Wie überprüfe ich die Syntax eines Bash-Skripts, ohne es auszuführen?

Wie füge ich einen Crontab-Job mit einem Bash-Skript zu Crontab hinzu?

Wiederherstellen von ~/.bashrc ohne Verwendung von Bash-Befehlen