Comment puis-je répondre automatiquement y dans le script bash?

14

Je veux désinstaller un programme via un script bash. Après avoir exécuté la commande, le terminal me demande si je suis sûr de vouloir le désinstaller. Je dois donc répondre y. Je veux le faire automatiquement et répondre yaprès un délai de 10 secondes.

J'ai fait cet exemple mais ça ne marche pas -

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

Une idée? Centos 7.2

Shalev Sason
la source
6
ITYM, #! /bin/bash -au lieu de#!/usr/bin
Stéphane Chazelas
vérifier si le uninstallprogramme accepte ou non des paramètres ou un script de configuration. Ce sera plus facile de cette façon
phuclv
1
Interrogé et répondu ad nauseam sur le Web. " ça ne marche pas" n'est pas une bonne description du problème. Peut-être pouvez-vous indiquer en quoi votre problème est différent des innombrables autres.
2
Ce que fait réellement votre script: exécutez-le uninstallet attendez qu'il se termine. Dormez ensuite 10 secondes. Ensuite, y\nfaites écho à stdout (qui est toujours connecté au terminal, pas à stdin de tout programme)
Peter Cordes

Réponses:

46

C'est à cela que yessert la commande. Il produit ys un par ligne indéfiniment afin qu'il puisse être dirigé vers des commandes qui posent des questions oui / non.

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

Cela répond yà toutes les questions. Pour répondre nà toutes les questions, remplacez yespar yes n. Pour un mélange prédéfini de yet n, vous pouvez remplacer yespar:

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

Ou exécutez-le en tant que:

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

Si vous avez besoin que la réponse ne soit pas disponible pour la lecture avant 10 secondes, vous feriez:

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

Mais cela ne serait probablement pas nécessaire, lorsque nous écrivons ysur le tuyau, il sera là pour uninstallle lire chaque fois qu'il veut le lire, il est peu probable que vous ayez besoin d'attendre qu'il soit prêt à le lire. L'exception serait si uninstalldécide de vider l'entrée avant de poser la question.

Tous ceux qui supposent que la uninstallcommande lit simplement chaque réponse comme une ligne d'entrée à partir de son entrée standard.

Pour les cas plus complexes, où la commande se lit comme suit les réponses directement à partir du dispositif TTY ou lorsque vous avez besoin de réponses d'alimentation sous condition (par exemple en fonction de ce que les sorties de commande), qui est là que vous voulez utiliser des choses comme expectou zshd » zpty.

Notez que de nombreux programmes interactifs peuvent entrer dans un mode non interactif lorsqu'ils passent une option. Vous voudrez peut-être consulter leur manuel avant de consacrer trop d'efforts à contourner le problème.

Stéphane Chazelas
la source
Merci! C'est très bien au cas où nous n'aurions besoin de répondre qu'à une seule question. Que se passe-t-il si nous devons répondre à 20 questions par exemple?
Shalev Sason
@Shalev, voir modifier.
Stéphane Chazelas
Merci ! Donc, si je veux entrer une autre valeur comme interger (2 par exemple), dois-je le remplacer au lieu de "y"? printf '% s \ n' ynnyyn 2 3 ny | / opt / MNG / MNGVIEWHP / fe / uninstall
Shalev Sason
Oui, c'est l'idée.
Stéphane Chazelas
3
@ShalevSason, dans toutes les solutions que j'ai données, comme avec echo "y", à chaque fois, nous écrivons y<newline>, en vous simulant en appuyant sur ypuis sur Entrée. Si vous voulez simuler en appuyant sur Entrée seul, cela alimenterait une ligne vide, alors printf '%s\n' y n '' 2 3(où ''est la ligne vide).
Stéphane Chazelas