Jak automatycznie odpowiedzieć y w skrypcie bash?

15

Chcę odinstalować jakiś program za pomocą skryptu bash. Po uruchomieniu polecenia terminal pyta mnie, czy jestem pewien, że chcę go odinstalować. Więc muszę odpowiedzieć y. Chcę to zrobić automatycznie i odpowiedzieć ypo 10 sekundach.

Zrobiłem ten przykład, ale nie działa -

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

Dowolny pomysł? Centos 7.2

Shalev Sason
źródło
6
ITYM, #! /bin/bash -zamiast#!/usr/bin
Stéphane Chazelas
sprawdź, czy uninstallprogram akceptuje parametry lub skrypt konfiguracyjny, czy nie. Tak będzie łatwiej
phuclv
1
Pytanie i odpowiedź na nudę w sieci. „ to nie działa” nie jest dobrym opisem problemu. Być może możesz powiedzieć, w jaki sposób twój problem różni się od niezliczonych innych.
2
Co faktycznie robi skrypt: uruchom uninstalli poczekaj, aż zakończy działanie. Potem spij 10 sekund. Then echo y\nna stdout (który nadal jest podłączony do terminalu, nie stdin każdego programu)
Peter Cordes

Odpowiedzi:

49

Po to yesjest polecenie. W ynieskończoność wysyła po jednym w wierszu, dzięki czemu może być przesyłany do poleceń, które zadają pytania typu tak / nie.

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

To odpowiedzi yna wszystkie pytania. Aby odpowiedzieć nna wszystkie pytania, wymieniać yessię yes n. Aby uzyskać predefiniowane połączenie yi n, możesz zastąpić yes:

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

Lub uruchom jako:

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

Jeśli potrzebujesz, aby odpowiedź nie była dostępna do czytania przed 10 sekundami, wykonaj następujące czynności:

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

Ale prawdopodobnie nie byłoby to konieczne, kiedy piszemy yna fajce, będzie tam, uninstallaby ją przeczytać, kiedy tylko zechce ją przeczytać, jest mało prawdopodobne, że będziesz musiał poczekać, aż będzie gotowy do przeczytania. Wyjątkiem jest sytuacja, gdy uninstallzdecyduje się wyczyścić dane wejściowe przed zadaniem pytania.

Wszyscy zakładają, że uninstallpolecenie po prostu odczytuje każdą odpowiedź jako jeden wiersz danych wejściowych ze standardowego wejścia.

W przypadku bardziej złożonych przypadkach, gdy komenda czyta odpowiedź bezpośrednio z urządzenia tty lub gdzie trzeba odpowiedziach paszowych warunkowo (na przykład na podstawie tego co wyjść poleceń), to gdzie chcesz używać rzeczy jak expectlub zsh„s zpty.

Zwróć uwagę, że wiele programów interaktywnych może przejść w tryb nieinteraktywny po przekazaniu opcji. Możesz najpierw sprawdzić ich instrukcję, zanim włożysz zbyt dużo wysiłku w obejście problemu.

Stéphane Chazelas
źródło
Dzięki! To dobrze, jeśli musimy odpowiedzieć tylko na jedno pytanie. Co się stanie, jeśli będziemy musieli na przykład odpowiedzieć na 20 pytań?
Shalev Sason
@Shalev, patrz edycja.
Stéphane Chazelas
Dzięki ! Więc jeśli chcę wprowadzić inne wartości, takie jak interger (na przykład 2), muszę zastąpić je zamiast „y”? printf '% s \ n' ynnyyn 2 3 ny | / opt / MNG / MNGVIEWHP / fe / uninstall
Shalev Sason
Tak, to jest pomysł.
Stéphane Chazelas
3
@ShalevSason, we wszystkich rozwiązaniach, które podałem, jak za echo "y"każdym razem, piszemy y<newline>, symulując naciśnięcie, ya następnie Enter. Jeśli chcesz zasymulować naciśnięcie klawisza Enter sam, karmiłoby to pustą linię, więc printf '%s\n' y n '' 2 3(gdzie ''jest pusta linia).
Stéphane Chazelas