Ich führe ein Skript aus, das die Eingabe von „y“ bei jeder Operation anfordert. Ich suche nach einer Lösung wie $ ./script < echo 'yyyyyyyyyyyyyy'
um alle meine Eingaben auf einmal zu übergeben.
Beste Antwort
Es gibt einen speziell für diesen Fall erstellten Befehl:yes
$ yes | ./script
Was dies tut, ist die Ausgabe von yes
zu verbinden zur Eingabe von ./script
. Wenn also ./script
nach Benutzereingaben fragt, erhält es stattdessen die Ausgabe yes
. Die Ausgabe von yes
ist ein endloser Strom von y
gefolgt von einem Zeilenumbruch. Also im Grunde so, als würde der Benutzer y
eingeben für jede Frage von ./script
.
Wenn Sie nein sagen möchten (n
) statt yes (y
) kannst du es so machen:
$ yes n | ./script
Beachten Sie, dass einige Tools die Option haben, immer yes
anzunehmen als Antwort. Siehe zum Beispiel hier:Bypass the yes/no prompt in ‘apt-get upgrade’
Andere Eingabemethoden:
Wenn Sie genau wissen, wie viele y
Ihr Skript erwartet, dass Sie es so machen können:
$ printf 'ynynyn' | ./script
Die Zeilenumbrüche (n
) sind die Eingabetasten.
Verwenden von printf
statt yes
Sie haben eine feinkörnigere Kontrolle über die Eingabe:
$ printf 'yesnnonmayben' | ./script
Beachten Sie, dass der Befehl in einigen seltenen Fällen nicht erfordert, dass der Benutzer nach dem Zeichen die Eingabetaste drückt. in diesem Fall lassen Sie die Zeilenumbrüche weg:
$ printf 'yyy' | ./script
Der Vollständigkeit halber können Sie auch hier ein Dokument verwenden:
$ ./script << EOF
y
y
y
EOF
Oder wenn Ihre Shell dies unterstützt, ein Here-String:
$ ./script <<< "y
y
y
"
Oder Sie können eine Datei mit einer Eingabe pro Zeile erstellen:
$ ./script < inputfile
Wenn der Befehl ausreichend komplex ist und die obigen Methoden nicht mehr ausreichen, können Sie Expect.
verwendenHier ist ein Beispiel für ein supereinfaches Expect-Skript:
spawn ./script
expect "are you sure?"
send "yesr"
expect "are you really sure?"
send "YES!r"
expect eof
Technischer Nitpick:
Der hypothetische Befehlsaufruf, den Sie in Ihrer Frage angegeben haben, funktioniert nicht:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Dies liegt daran, dass die Shell-Grammatik überall in der Befehlszeile einen Umleitungsoperator zulässt. Soweit es die Shell betrifft, ist Ihre hypothetische Befehlszeile dieselbe wie diese Zeile:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Das bedeutet ./script
wird mit dem Argument 'yyyyyyyyyyyyyy'
aufgerufen und die Standardeingabe erhält Eingaben aus einer Datei namens echo
. Und bash beschwert sich, da die Datei nicht existiert.