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?

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.


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.


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

3
Eine übliche, wenn auch ironische Verwendung ist yes nzum Beispiel:yes n | mv -i * somewhere/
Sam Watkins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.