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.