¿Cómo escribo una respuesta "sí" para instalar programas?

113

Trabajo con instancias de Amazon Linux y tengo un par de scripts para completar datos e instalar todos los programas con los que trabajo, pero un par de programas preguntan:

Do you want to continue [Y/n]?

y pausa la instalación. Quiero contestar automáticamente "Y" en todos los casos, ahora estoy seguro de cómo hacerlo.

usuario974887
fuente
3
El administrador de paquetes puede tener un indicador --noprompto --noconfirmque puede usar.
Blender

Respuestas:

209

El comando 'sí' hará eco de 'y' (o lo que sea que le pida) indefinidamente. Úselo como:

yes | command-that-asks-for-input

o, si se requiere una 'Y' mayúscula:

yes Y | command-that-asks-for-input
PT
fuente
¿Esto solo funciona con algún comando compatible para usar la entrada de sí, no es así? Intenté con una mirada de OpenStack y esto no funcionó, creo que Expect es más preciso para todas las circunstancias
HVNSweeting
1
//, ¿Qué pasa si tienes que ingresar la palabra completa "sí"?
Nathan Basanese
1
Tenga cuidado con yesya que se sabe que maximiza la CPU. stackoverflow.com/a/18164007/720665
David Salamon
Agradable. Esto me hizo la vida mucho más fácil. :RE. También -ybuscar en Google scripts bash fue DIFÍCIL.
Nathan Smith
1
@DavidSalamon ese es solo el caso cuando se escribe en algo sin límite, como /dev/nullo STDOUT. Conectado a un comando, solo escribirá una línea en el conducto cada vez que el comando de recepción lea una, y esperará en caso contrario.
Walf
68

echo y | command Deberia trabajar.

Además, algunos instaladores tienen un indicador de "auto-sí". Es -ypara apt-getUbuntu.

Dennis
fuente
Estoy tratando de hacer echo "giturl no" | jspm registro crear registro_name jspm-git en mi script de shell. pero sigue fallando. al entrar en el giurl. ¿Alguna idea?
manismku
Otro ejemplo: en docker-compose hay un indicador -f( --force) que funciona como "auto-sí" para los comandos que eliminan algo
luke
¿Cómo "repite Y" de forma recursiva en caso de que el mensaje solicite una confirmación más de una vez?
Safak Ozkan
18

Es posible que no tenga la capacidad de instalar Expect en el servidor de destino. Este suele ser el caso cuando uno escribe, digamos, un trabajo de Jenkins.

Si es así, consideraría algo como la respuesta a lo siguiente en askubuntu.com:

/ubuntu/338857/automatically-enter-input-in-command-line

printf 'y\nyes\nno\nmaybe\n' | ./script_that_needs_user_input

Tenga en cuenta que, en algunos casos raros, el comando no requiere que el usuario presione Intro después del carácter. en ese caso, deje las nuevas líneas fuera:

printf 'yyy' | ./script_that_needs_user_input

En aras de la integridad, también puede utilizar un documento aquí:

./script_that_needs_user_input << EOF
y
y
y
EOF

O si su shell lo admite, una cadena aquí:

./script <<< "y
y
y
"

O puede crear un archivo con una entrada por línea:

./script < inputfile

Nuevamente, todo el crédito por esta respuesta es para el autor de la respuesta en askubuntu.com , lesmana.

Nathan Basanese
fuente
//, asegúrese de votar a favor del usuario de askubuntu.com @lesmana si le gusta esta respuesta.
Nathan Basanese
6

Aunque esto puede ser más complicado / pesado de lo que desea, una forma muy flexible de hacerlo es usar algo como Expect (o uno de los derivados en otro lenguaje de programación).

Expect es un lenguaje diseñado específicamente para controlar aplicaciones basadas en texto, que es exactamente lo que busca hacer. Si termina necesitando hacer algo más complicado (como con la lógica para decidir qué hacer / responder a continuación), Expect es el camino a seguir.

Adam Batkin
fuente
6

Solo necesitas poner -ycon el comando de instalación.

Por ejemplo: yum install <package_to_install> -y

Rohan Seth
fuente
3

Si solo desea aceptar los valores predeterminados, puede usar:

\n | ./shell_being_run
Warhansen
fuente
//, ¿Cómo significa esto que aceptaría valores predeterminados?
Nathan Basanese
2
En bash, shy en la mayoría de los sistemas, que conozco, es necesario que, de echolo \ncontrario, no se canalizaría al siguiente comando.
2i3r