Lassen Sie das Bash-Skript interaktive Eingabeaufforderungen beantworten [duplizieren]

109

Ist es möglich, dass ein Bash-Skript automatisch Eingabeaufforderungen verarbeitet, die dem Benutzer normalerweise mit Standardaktionen angezeigt werden? Derzeit verwende ich ein Bash-Skript, um ein internes Tool aufzurufen, das dem Benutzer Aufforderungen zur Eingabe von Aktionen anzeigt (Aufforderung zur Eingabe von J / N). Das Skript, das ich schreibe, muss jedoch vollständig "hands-off" sein Ich brauche eine Möglichkeit, um Y|Nan die Eingabeaufforderung zu senden , damit das Programm die Ausführung fortsetzen kann. Ist das möglich?

TJ L.
quelle
Dies ist nicht "Autocompletion" ... wie @unwind sagt, es ist "Automatisierung"
Benzaita
3
Beispiel für die Verwendung yesdazu: unix.stackexchange.com/questions/47344/…
Droogans

Antworten:

65

Dies ist keine "automatische Vervollständigung", sondern eine Automatisierung. Ein gängiges Werkzeug für diese Dinge heißt Expect .

Sie könnten auch nur mit Piping-Eingaben von davonkommen yes.

entspannen
quelle
3
Leider kann ich nicht erwarten, dass auf dem System, auf dem dies ausgeführt wird, strenge Speicherplatzanforderungen bestehen, sodass ich keine zusätzlichen Pakete hinzufügen kann, aber das Einleiten yeshat den Trick getan. Glücklicherweise erforderten alle Eingabeaufforderungen ohnehin nur ein 'y'. Vielen Dank.
TJ L
Funktioniert jedoch Yes | commandmöglicherweise nicht immer. Wenn es nur zu Installationszwecken ist, dann ist die Verwendung -yeine bessere und bevorzugte Option.
Umesh Kaushik
169

Eine einfache

echo "Y Y N N Y N Y Y N" | ./your_script

Auf diese Weise können Sie eine beliebige Folge von "Y" oder "N" an Ihr Skript übergeben.

Loïc Février
quelle
3
Wenn ich irgendwelche senden Nmüsste, hätte ich diese Methode verwendet, aber ich brauchte nur Ys, also ging ich mit yes. Schade, dass ich zwei Antworten nicht akzeptieren kann, da beide richtig sind.
TJ L
3
;) Nun, wenn du jemals welche schicken Nmusst, hast du jetzt eine gute Möglichkeit, dies zu tun.
Loïc Février
2
Das funktioniert bei mir nicht; Leerzeichen zählen nicht als neue Zeilen --- Wenn ich zum Beispiel "Y N" wiedergebe, gibt es die Zeichenfolge "Y N"als Eingabe für die erste Eingabeaufforderung und hängt an der zweiten Eingabeaufforderung und wartet darauf, dass ich sie vervollständige. Ich habe versucht, die Leerzeichen in Zeilenumbrüche zu ändern, aber das hat auch nicht funktioniert. Trotzdem habe ich der Eingabeaufforderung eine wörtliche Zeichenfolge gegeben.
temporärer_Benutzername
52
versuchen Sie es mit printf 'y\ny\ny\n' | ./your_script. Auf diese Weise fügen Sie die neue Zeile für jeden erwarteten Eintrag manuell ein.
Majid
8
printf '%s\n' Y Y N N Y N Y Y NSetzt Zeilenumbrüche zwischen die Elemente, ohne dass eine große Formatzeichenfolge erforderlich ist.
Charles Duffy
16

Ich fand, dass der beste Weg, um Eingaben zu senden, darin besteht, cat und eine Textdatei zu verwenden, um alle Eingaben weiterzugeben, die Sie benötigen.

cat "input.txt" | ./Script.sh
Alex
quelle
Expect hat bei mir nicht wie erwartet funktioniert. Dies ist die einfachste und beste Antwort auf diese Frage.
cloudxix
12

Wenn Sie nur Y zum Senden haben:

$> yes Y |./your_script

Wenn Sie nur N senden müssen:

$> yes N |./your_script
Douardo
quelle
9

In meiner Situation musste ich einige Fragen ohne J oder N, aber mit Text oder Leerzeichen beantworten. Ich fand den besten Weg, dies in meiner Situation zu tun, darin, eine Shellscript-Datei zu erstellen. In meinem Fall habe ich es autocomplete.sh genannt

Ich musste einige Fragen für einen Exporteur von Doktrinschemata beantworten, damit meine Datei so aussah.

- Dies ist nur ein Beispiel -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

Was mir an dieser Strategie gefällt, ist, dass Sie Ihre Antworten kommentieren können und bei Verwendung von EOF eine leere Zeile genau das ist (die Standardantwort). Es stellt sich heraus, dass dieses Exporteur-Tool ein eigenes JSON-Gegenstück zur Beantwortung dieser Fragen hat, aber ich habe das herausgefunden, nachdem ich dies getan habe =).

Um das Skript auszuführen, befinden Sie sich einfach in dem gewünschten Verzeichnis und führen es 'sh autocomplete.sh'im Terminal aus.

Kurz gesagt, indem Sie << EOL & EOF in Kombination mit Return Lines verwenden , können Sie jede Frage der Eingabeaufforderung nach Bedarf beantworten. Jede neue Zeile ist eine neue Antwort.

Mein Beispiel zeigt nur, wie dies mit Kommentaren auch mit dem Zeichen `gemacht werden kann, damit Sie sich daran erinnern, was jeder Schritt ist.

Beachten Sie, dass der andere Vorteil dieser Methode darin besteht, dass Sie mit mehr als nur J oder N antworten können. Sie können sogar mit Leerzeichen antworten!

Hoffe das hilft jemandem.

Joseph Astrahan
quelle
4

Hierfür gibt es ein spezielles eingebautes Util - " Ja ".

Um alle Fragen mit derselben Antwort zu beantworten, können Sie ausführen

yes [answer] |./your_script

Oder Sie können es in Ihr Skript einfügen, um eine spezifische Antwort auf jede Frage zu erhalten

Asaf Pinhassi
quelle
Wie kann ich das im Skript machen? Ich möchte für jede Frage unterschiedliche Antworten angeben
Sengo