¿Cómo respondo automáticamente y en bash script?

14

Quiero desinstalar algún programa a través de un script bash. Después de ejecutar el comando, el terminal me pregunta si estoy seguro de que quiero desinstalarlo. Entonces necesito responder y. Quiero hacerlo automáticamente y responder ydespués de un retraso de 10 segundos.

Hice este ejemplo pero no funciona.

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

¿Alguna idea? Centos 7.2

Shalev Sason
fuente
66
ITYM, en #! /bin/bash -lugar de#!/usr/bin
Stéphane Chazelas
compruebe si el uninstallprograma acepta parámetros o un script de configuración o no. Será más fácil de esa manera
phuclv
1
Preguntó y respondió ad nauseam en toda la web. " no está funcionando" no es una buena descripción del problema. Quizás pueda indicar cómo su problema es diferente de los innumerables otros.
2
Lo que hace realmente tu script: ejecuta uninstally espera a que salga. Luego duerme 10 segundos. Luego y\nhaga eco a stdout (que todavía está conectado a la terminal, no a stdin de ningún programa)
Peter Cordes

Respuestas:

46

Para eso es el yescomando. Produce yuno por línea indefinidamente, por lo que puede canalizarse a comandos que hacen preguntas sí / no.

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

Eso responde ya todas las preguntas. Para responder na todas las preguntas, reemplace yescon yes n. Para una mezcla predefinida de yy n, puede reemplazar yescon:

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

O ejecutarlo como:

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

Si necesita que la respuesta no esté disponible para leer antes de 10 segundos, haría:

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

Pero eso probablemente no sea necesario, cuando escribamos yen la tubería, estará allí para uninstallleerlo cuando quiera leerlo, es poco probable que tenga que esperar a que esté listo para leerlo. La excepción sería si uninstalldecide vaciar la entrada antes de hacer la pregunta.

Todos los que asumen que el uninstallcomando solo lee cada respuesta como una línea de entrada de su entrada estándar.

Para casos más complejos, donde el comando lee las respuestas directamente desde el dispositivo tty o donde necesita alimentar las respuestas condicionalmente (por ejemplo, en función de lo que genera el comando), ahí es donde usaría cosas como expecto zsh's zpty.

Tenga en cuenta que muchos programas interactivos pueden ingresar a un modo no interactivo cuando se pasa alguna opción. Es posible que desee consultar primero su manual, antes de dedicar demasiado esfuerzo a solucionar el problema.

Stéphane Chazelas
fuente
¡Gracias! Esto está bien en caso de que necesitemos responder solo para una pregunta. ¿Qué sucede si tenemos que responder a 20 preguntas, por ejemplo?
Shalev Sason
@Shalev, ver edición.
Stéphane Chazelas
Gracias ! Entonces, si quiero ingresar otros valores como interger (2 por ejemplo), ¿debo reemplazarlo en lugar de "y"? printf '% s \ n' ynnyyn 2 3 ny | / opt / MNG / MNGVIEWHP / fe / uninstall
Shalev Sason
Sí, esa es la idea.
Stéphane Chazelas
3
@ShalevSason, en todas las soluciones que he dado, como echo "y"cada vez, escribimos y<newline>, simulando que presionas yseguido de Enter. Si desea simular presionar Enter solo, eso estaría alimentando una línea vacía, entonces printf '%s\n' y n '' 2 3(¿dónde ''está la línea vacía?).
Stéphane Chazelas