Ich führe ein Skript aus, das bei jeder Operation die Eingabe von 'y' anfordert. Ich suche nach einer Lösung $ ./script < echo 'yyyyyyyyyyyyyy'
, um alle meine Eingaben auf einmal zu übermitteln.
command-line
input
NewMrd
quelle
quelle
-f
funktioniert die Option auch mit bestimmten Befehlen.Antworten:
Es gibt einen speziell für diesen Fall erstellten Befehl:
yes
Damit verbinden Sie den Ausgang von
yes
mit dem Eingang von./script
. Wenn./script
nach Benutzereingaben gefragt wird, wird stattdessen die Ausgabe von abgerufenyes
. Die Ausgabe vonyes
ist ein endloser Strom vony
gefolgt von einer neuen Zeile. Also im Grunde, als ob der Benutzery
für jede Frage von eingibt./script
.Wenn Sie
n
statt yes (y
) no ( ) sagen möchten, können Sie dies folgendermaßen tun:Beachten Sie, dass einige Tools die Option haben, immer
yes
als Antwort zu fungieren . Siehe hier zum Beispiel: Umgehen der Ja / Nein-Aufforderung in 'apt-get upgrade'Andere Eingabemethoden:
Wenn Sie genau wissen, wie viele von
y
Ihrem Skript erwartet werden, können Sie dies folgendermaßen tun:Die Zeilenumbrüche (
\n
) sind die Eingabetasten.Verwenden Sie
printf
anstelle vonyes
, um die Eingabe feiner zu steuern:Beachten Sie, dass der Benutzer in einigen seltenen Fällen nicht die Eingabetaste nach dem Zeichen drücken muss. in diesem Fall lassen Sie die Zeilenumbrüche weg:
Der Vollständigkeit halber können Sie hier auch ein Dokument verwenden :
Oder wenn Ihre Shell einen Here-String unterstützt :
Oder Sie können eine Datei mit einer Eingabe pro Zeile erstellen:
Wenn der Befehl ausreichend komplex ist und die oben genannten Methoden nicht mehr ausreichen, können Sie expect verwenden .
Hier ist ein Beispiel für ein supereinfaches Expect-Skript:
Technischer Nitpick:
Der hypothetische Befehlsaufruf, den Sie in Ihrer Frage angegeben haben, funktioniert nicht:
Dies liegt daran, dass die Shell-Grammatik einen Umleitungsoperator an einer beliebigen Stelle in der Befehlszeile zulässt. Für die Shell ist Ihre hypothetische Befehlszeile dieselbe wie die folgende:
Das heißt, es
./script
wird mit dem Argument aufgerufen'yyyyyyyyyyyyyy'
und die stdin wird von einer Datei mit dem Namen eingegebenecho
. Und bash beschwert sich, da die Datei nicht existiert.quelle
cannot enable tty mode on non tty input
. Würdest du einen Workaround dafür kennen?printf
Trick mit einerrun
Datei versuche , deren Installation ich automatisieren muss, erhalte ich lediglich eine Fehlermeldung.Warning: Tried to connect to session manager, None of the authentication protocols specified are supported
Das Skript wird in einem neuen Terminal geöffnet und fordert mich auf, meine Eingaben wie gewohnt manuell einzugeben. Dies geschieht übrigens unter Debian. Irgendwelche Vorschläge?Verwenden Sie den Befehl
yes
:Auszug aus der Manpage:
quelle
Einige Dinge (
apt-get
zum Beispiel) akzeptieren spezielle Flags, um im unbeaufsichtigten Modus ausgeführt zu werden (und akzeptieren Standardeinstellungen). In diesemapt-get
Fall übergeben Sie einfach eine-y
Flagge. Dies hängt jedoch vollständig von Ihrem Skript ab.Wenn Sie kompliziertere Dinge benötigen, können Sie Ihr Skript in ein Expect-Skript einbinden. Mit expect können Sie Ausgaben lesen und Eingaben senden, sodass Sie ziemlich komplizierte Dinge tun können, die andere Skripte nicht zulassen würden. Hier ist eines der Beispiele auf der Wikipedia-Seite :
quelle
.sh
Shell-Skript verwendet werden, oder? Oder gibt es einen Weg?Im Shell-Skript können Sie auch den folgenden Trick von Spawn, Expect und Send verwenden
Im obigen Szenario müssen Sie jedoch den Ausdruck angeben, den Sie erwarten, während Sie das Skript ausführen. Weitere Beispiele finden Sie unter folgendem Link
Erwarten Sie in Bash
quelle
Okay, dies ist möglicherweise keine sehr elegante Lösung, aber wenn Sie Ihre Optionen in eine separate Datei schreiben und sie dann als Eingabe an das Skript übergeben, funktioniert dies ebenfalls. Wenn Sie also eine neue Datei mit all Ihren Optionen erstellen (nennen Sie diese Datei 'options.in'), können Sie Ihr Skript ganz einfach ausführen
./script.sh < options.in
und verschiedene Optionsdateien nach Bedarf bearbeiten / erstellen.quelle
options.in
Datei schreiben ? Kannst du ein Beispiel geben?Ich habe ein Bash-Skript mit Dialog geschrieben und brauchte dies auch, um automatisch zu funktionieren. Ich habe das getan und es hat wie ein Zauber funktioniert.
quelle
Sie können Benutzereingaben für Ihr Skript
cat
aus einer Textdatei bereitstellen , die folgendermaßen an Ihr Skript weitergeleitet wirdbash
:Fügen Sie einfach die gewünschten Benutzereingaben in Ihre input.txt-Datei ein, und wählen Sie die gewünschten Antworten aus - y, n, Ziffern, Zeichenfolgen usw.
quelle