Bereiten Sie Antworten auf Fragen eines Befehls vor

14

Angenommen, ich möchte ein Shell-Skript schreiben, das nur einen Befehl ausführt. Dieser Befehl ist jedoch schlecht konzipiert. Es werden keine Befehlszeilenoptionen angeboten. Stattdessen werden einige Fragen gestellt und auf Benutzereingaben gewartet.

Gibt es eine Möglichkeit, diese Eingabe im Skript vorzubereiten, damit die Fragen automatisch beantwortet werden?

tmücksch
quelle

Antworten:

16

Wenn der Befehl nicht sehr wählerisch ist, sollte er ungefähr so ​​funktionieren:

command > /dev/null << EOF
<answer 1>
<answer 2>
<answer 3>
EOF

Dies setzt voraus, dass Sie die genauen Antworten im Voraus kennen.

Björn Munch
quelle
Sie können die obige Antwort zum Entwerfen eines Wrapping-Skripts verwenden. Das neue Skript sollte die Parameter abhören und den alten Befehl mit der obigen Methode aufrufen.
Walter A
Auch als HIER-Dokument bekannt. Für weitere Informationen versuchen Sie bitte Wikipedia hier. Dokumentdefinition
OldTimer
15

Expect kann das. Von der Expect- Website :

Expect ist ein Tool zur Automatisierung interaktiver Anwendungen wie Telnet, FTP, Passwd, Fsck, Rlogin, Tip usw. Expect macht dieses Zeug wirklich trivial. Expect ist auch nützlich, um dieselben Anwendungen zu testen [...] "

Es kommt mit viel Hilfe, wie Autoexpect .

Wieder von der Expect-Website,

autoexpect überwacht die Interaktion mit einem anderen Programm und erstellt ein Expect-Skript, das Ihre Interaktionen reproduziert. Bei geraden Skripten spart autoexpect viel Zeit gegenüber dem manuellen Schreiben von Skripten.

Christopher
quelle
Vielen Dank für Ihre Antwort. Da meine Bedürfnisse sehr gering sind, ist Expect in meinem Fall übertrieben. Björns Antwort passt perfekt zu meinen Bedürfnissen. Aber ich würde vorschlagen, Ihre Antwort für andere zu behalten, die eine komplexere Lösung benötigen.
tmuecksch
+1, weil ich nicht wusste, dass autoexpect existiert und gedacht hatte, dass die erwartete Lernkurve zu steil für mich war, um mich damit zu beschäftigen. Ich werde noch einen Blick darauf werfen.
Joe
7

Wenn Ihr Skript erwartet, dass eine Eingabeaufforderung beantwortet wird, oder mehrere Eingabeaufforderungen, in denen Sie dieselbe Antwort geben können, gibt es Folgendes yes:

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or `y'.

Benutze es so:

yes Me | give_a_hug.sh
unperson325680
quelle
3
Eine übliche, wenn auch ironische Verwendung ist yes nzum Beispiel:yes n | mv -i * somewhere/
Sam Watkins