Wie beantworte ich y automatisch im Bash-Skript?

14

Ich möchte ein Programm über ein Bash-Skript deinstallieren. Nachdem ich den Befehl ausgeführt habe, fragt mich das Terminal, ob ich sicher bin, dass ich ihn deinstallieren möchte. Also muss ich antworten y. Ich möchte es automatisch tun und ynach einer Verzögerung von 10 Sekunden antworten .

Ich habe dieses Beispiel gemacht, aber es funktioniert nicht -

#!/usr/bin
/opt/MNG/MNGVIEWHP/fe/uninstall
sleep 10
echo "y"

Irgendeine Idee? Centos 7.2

Shalev Sason
quelle
6
ITYM, #! /bin/bash -anstelle von#!/usr/bin
Stéphane Chazelas
Überprüfen Sie, ob das uninstallProgramm Parameter oder ein Konfigurationsskript akzeptiert oder nicht. Auf diese Weise wird es einfacher
phuclv
1
Ad nauseam im Internet gefragt und beantwortet . " es funktioniert nicht" ist keine gute Beschreibung des Problems. Vielleicht können Sie angeben, wie sich Ihr Problem von den unzähligen anderen unterscheidet.
2
Was Ihr Skript tatsächlich tut: Führen Sie es aus uninstallund warten Sie, bis es beendet wird. Dann schlafen Sie 10 Sekunden. Dann Echo y\nzu stdout (das immer noch mit dem Terminal verbunden ist, nicht zu stdin eines Programms)
Peter Cordes

Antworten:

45

Dafür ist der yesBefehl da. Es gibt yeine pro Zeile auf unbestimmte Zeit aus, sodass es an Befehle weitergeleitet werden kann, die Ja / Nein-Fragen stellen.

yes | /opt/MNG/MNGVIEWHP/fe/uninstall

Das beantwortet yalle Fragen. Um nalle Fragen zu beantworten , ersetzen Sie yesdurch yes n. Für eine vordefinierte Mischung aus yund nkönnen Sie ersetzen yesdurch:

printf '%s\n' y n n y y n...

Oder führen Sie es aus als:

/opt/MNG/MNGVIEWHP/fe/uninstall << 'EOF'
y
n
n
y
y
n
EOF

Wenn die Antwort nicht vor 10 Sekunden zum Lesen verfügbar sein muss, tun Sie Folgendes:

(sleep 10; echo y; sleep 2; echo n;...) | /opt/MNG/MNGVIEWHP/fe/uninstall

Aber das wäre wahrscheinlich nicht notwendig, wenn wir yan die Pipe schreiben , wird sie da sein, um sie uninstallzu lesen, wann immer sie sie lesen möchte. Es ist unwahrscheinlich, dass Sie warten müssen, bis sie bereit ist, sie zu lesen. Die Ausnahme wäre, wenn uninstallentschieden wird, die Eingabe zu leeren, bevor die Frage gestellt wird.

Alle diese gehen davon aus, dass der uninstallBefehl jede Antwort nur als eine Eingabezeile von ihrer Standardeingabe liest.

Für komplexere Fälle, in denen der Befehl die Antworten direkt aus dem tty - Gerät liest oder in denen Sie bedingt Feed Antworten (zum Beispiel auf dem, was die Befehlsausgaben), das ist , wo man Dinge wie benutzen würde expectoder zsh‚s zpty.

Beachten Sie, dass viele interaktive Programme in einen nicht interaktiven Modus wechseln können, wenn eine Option übergeben wird. Möglicherweise möchten Sie zuerst das Handbuch überprüfen, bevor Sie sich zu sehr um das Problem kümmern.

Stéphane Chazelas
quelle
Vielen Dank! Dies ist in Ordnung, falls wir nur eine Frage beantworten müssen. Was ist passiert, wenn wir zum Beispiel 20 Fragen beantworten müssen?
Shalev Sason
@Shalev, siehe bearbeiten.
Stéphane Chazelas
Vielen Dank ! Wenn ich also andere Werte wie interger (z. B. 2) eingeben möchte, muss ich diese anstelle von "y" ersetzen? printf '% s \ n' ynnyyn 2 3 ny | / opt / MNG / MNGVIEWHP / fe / deinstallieren
Shalev Sason
Ja, das ist die Idee.
Stéphane Chazelas
3
@ShalevSason, in all den Lösungen, die ich gegeben habe, echo "y"schreiben wir jedes Mal, y<newline>indem wir simulieren, dass Sie drücken, ygefolgt von Enter. Wenn Sie simulieren möchten, dass Sie nur die Eingabetaste drücken, wird eine leere Zeile eingegeben printf '%s\n' y n '' 2 3(also wo ''ist die leere Zeile).
Stéphane Chazelas