it-swarm.com.de

Lassen Sie das Bash-Skript interaktive Eingabeaufforderungen beantworten

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 In-House-Tool aufzurufen, das dem Benutzer Eingabeaufforderungen anzeigt (zur Eingabe von J/N auffordert), um die Aktionen abzuschließen. Das Skript, das ich schreibe, muss jedoch vollständig "hands-off" sein Ich brauche eine Möglichkeit, Y|N an die Eingabeaufforderung zu senden, damit das Programm die Ausführung fortsetzen kann. Ist das möglich?

78
tj111

Dies ist keine "Autovervollständigung", dies ist Automatisierung. Ein allgemeines Werkzeug für diese Dinge heißt Expect .

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

57
unwind

Eine einfache

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

Dadurch können Sie eine beliebige Sequenz von "Y" oder "N" an Ihr Skript übergeben.

132
Loïc Février

Die beste Methode zum Senden von Eingaben ist die Verwendung von cat und einer Textdatei, um die von Ihnen benötigten Eingaben zu übergeben.

cat "input.txt" | ./Script.sh
11
Alex

Wenn Sie nur J zum Senden haben: 

$> yes Y |./your_script

Wenn Sie nur N zum Senden haben: 

$> yes N |./yout_script
11
douardo

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

Ich musste einige Fragen für einen Doktrinschema-Exporter beantworten, sodass 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. Bei Verwendung von EOF ist eine leere Zeile genau das (die Standardantwort). Wie sich herausstellt, hat dieses Exporter-Tool ein eigenes JSON-Pendant für die Beantwortung dieser Fragen, aber ich habe das herausgefunden, nachdem ich dies getan habe =).

um das Skript auszuführen, begeben Sie sich einfach in das gewünschte Verzeichnis und führen Sie 'sh autocomplete.sh' im Terminal aus.

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

Mein Beispiel zeigt nur, wie dies mit Kommentaren möglich ist, die auch das Zeichen `verwenden, damit Sie sich an die einzelnen Schritte erinnern können.

Beachten Sie den anderen Vorteil dieser Methode: Sie können mit mehr als nur mit Y oder N antworten. Tatsächlich können Sie mit Leerzeichen antworten!

Hoffe, das hilft jemandem.

6
Joseph Astrahan

Es gibt ein spezielles eingebautes Programm für diesen Zweck - ' yes '.

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

yes [answer] |./your_script

Oder Sie können es in Ihr Skript einfügen und haben auf jede Frage eine spezifische Antwort

0
Asaf Pinhassi