Come rispondo automaticamente y nello script bash?


14

Voglio disinstallare alcuni programmi tramite uno script bash. Dopo aver eseguito il comando, il terminale mi chiede se sono sicuro di voler disinstallarlo. Quindi devo rispondere y. Voglio farlo automaticamente e rispondere ydopo un ritardo di 10 secondi.

Ho fatto questo esempio ma non funziona -

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

Qualche idea? Centos 7.2


6
ITYM, #! /bin/bash -invece di#!/usr/bin
Stéphane Chazelas il

controlla se il uninstallprogramma accetta parametri o uno script di configurazione oppure no. Sarà più facile in questo modo
phuclv,

1
Chiesto e risposto alla nausea in tutto il web. " non funziona" non è una buona descrizione del problema. Forse puoi affermare come il tuo problema sia diverso rispetto agli innumerevoli altri.

2
Cosa fa effettivamente il tuo script: esegui uninstalle attendi che termini. Quindi dormire 10 secondi. Quindi y\nfai eco a stdout (che è ancora collegato al terminale, non allo stdin di alcun programma)
Peter Cordes,

Risposte:


47

Ecco a cosa yesserve il comando. Emette yuno per riga indefinitamente in modo da poter essere reindirizzato a comandi che fanno domande sì / no.

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

Questo risponde ya tutte le domande. Per rispondere na tutte le domande, sostituire yescon yes n. Per un mix predefinito di ye n, è possibile sostituire yescon:

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

O eseguilo come:

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

Se hai bisogno che la risposta non sia disponibile per la lettura prima di 10 secondi, dovresti:

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

Ma probabilmente non sarebbe necessario, quando scriviamo ynella pipe, sarà lì per uninstallleggerlo ogni volta che vuole leggerlo, è improbabile che tu debba aspettare che sia pronto per leggerlo. L'eccezione sarebbe se uninstalldecide di svuotare l'input prima di porre la domanda.

Tutti quelli assumono che il uninstallcomando legga solo ogni risposta come una riga di input dal suo input standard.

Per i casi più complessi, in cui il comando legge le risposte direttamente dal dispositivo tty o in cui è necessario alimentare le risposte in modo condizionale (ad esempio in base a ciò che il comando genera), è lì che dovresti usare cose come expecto zsh's zpty.

Si noti che molti programmi interattivi possono accedere a una modalità non interattiva quando vengono passate alcune opzioni. Potresti voler controllare prima il loro manuale, prima di spendere troppo per ovviare al problema.


Grazie! Questo va bene nel caso in cui dobbiamo rispondere solo per una domanda. Cosa accadrebbe se dovessimo rispondere ad esempio a 20 domande?
Shalev Sason,

@Shalev, vedi modifica.
Stéphane Chazelas,

Grazie ! Quindi, se voglio inserire un altro valore come interger (ad esempio 2) devo sostituirlo invece di "y"? printf '% s \ n' ynnyyn 2 3 ny | / opt / MNG / MNGVIEWHP / fe / uninstall
Shalev Sason

Sì, questa è l'idea.
Stéphane Chazelas,

3
@ShalevSason, in tutte le soluzioni che ho dato, come echo "y"ogni volta, scriviamo y<newline>, simulandoti premendo yseguito da Enter. Se si desidera simulare premendo Invio da solo, ciò alimenterebbe una linea vuota, quindi printf '%s\n' y n '' 2 3(dov'è ''la linea vuota).
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.