2010-09-27 20 views
51

¿Es posible tener un script bash que maneje automáticamente las solicitudes que normalmente se presentarían al usuario con acciones predeterminadas? Actualmente estoy usando un script bash para llamar a una herramienta interna que mostrará mensajes al usuario (solicitando S/N) para completar acciones, sin embargo, el script que estoy escribiendo debe estar completamente "sin manos", por lo que Necesito una forma de enviar Y|N al aviso para permitir que el programa continúe la ejecución. es posible?Hacer que el script bash responda solicitudes interactivas

+0

esto no es "autocompletado" ... como @unwind dice, es "automatización" – benzaita

+1

Ejemplo de uso de 'yes' para hacer esto: http://unix.stackexchange.com/questions/47344/the-yes- command # comment65866_47344 – Droogans

Respuesta

39

Esto no es "finalización automática", esto es automatización. Una herramienta común para estas cosas se llama Expect.

También puede salirse con solo la entrada de tubería de yes.

+1

Lamentablemente no puedo esperar porque sus requisitos de espacio son muy estrictos en el sistema que ejecuta esto, así que no puedo agregar paquetes adicionales, pero puse 'sí' en el truco, afortunadamente todas las instrucciones solo requerían un 'y ' de todas formas. Gracias. – tj111

+0

Sin embargo 'Sí | command' puede no funcionar siempre. Si solo es para fines de instalación, me caí usando '-y' es una opción mejor y preferida. –

96

Un simple

echo "Y Y N N Y N Y Y N" | ./your_script 

Esto permite pasar cualquier secuencia de "Y" o "N" a la secuencia de comandos.

+0

Si tuviera que enviar cualquier 'N's, habría usado este método, pero solo necesitaba Y, así que fui con' yes'. Lástima que no puedo aceptar dos respuestas, ya que ambas son correctas. – tj111

+2

;) Bueno, si alguna vez necesitas enviar alguna 'N', ahora tienes una buena manera de hacerlo. –

+0

Esta solución alternativa es brillante para mi comportamiento perezoso de CLI. ¡Gracias! – mbb

9

Encontré que la mejor manera de enviar entradas es utilizar cat y un archivo de texto para transmitir cualquier entrada que necesite.

cat "input.txt" | ./Script.sh 
7

Si sólo dispone Y enviar:

$> yes Y |./your_script 

Si sólo tiene N enviar:

$> yes N |./yout_script 
4

En mi situación que tenía que responder a algunas preguntas sin S o N pero con texto o en blanco. Encontré que la mejor manera de hacer esto en mi situación era crear un archivo shellscript. En mi caso lo llamé autocomplete.sh

Necesitaba responder algunas preguntas para un exportador de esquema doctrinal para que mi archivo se viera así.

- Este es sólo un ejemplo -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF 
`#Export to Doctrine Annotation Format`          1 
`#Would you like to change the setup configuration before exporting`  y 
`#Log to console`               y 
`#Log file`                 testing.log 
`#Filename [%entity%.%extension%]` 
`#Indentation [4]` 
`#Use tabs [no]` 
`#Eol delimeter (win, unix) [win]` 
`#Backup existing file [yes]` 
`#Add generator info as comment [yes]` 
`#Skip plural name checking [no]` 
`#Use logged storage [no]` 
`#Sort tables and views [yes]` 
`#Export only table categorized []` 
`#Enhance many to many detection [yes]` 
`#Skip many to many tables [yes]` 
`#Bundle namespace []` 
`#Entity namespace []` 
`#Repository namespace []` 
`#Use automatic repository [yes]` 
`#Skip column with relation [no]` 
`#Related var name format [%name%%related%]` 
`#Nullable attribute (auto, always) [auto]` 
`#Generated value strategy (auto, identity, sequence, table, none) [auto]` 
`#Default cascade (persist, remove, detach, merge, all, refresh,) [no]` 
`#Use annotation prefix [ORM\]` 
`#Skip getter and setter [no]` 
`#Generate entity serialization [yes]` 
`#Generate extendable entity [no]`           y 
`#Quote identifier strategy (auto, always, none) [auto]` 
`#Extends class []` 
`#Property typehint [no]` 
EOF 

Lo que me gusta de esta estrategia es que se puede comentar lo que sus respuestas son EOF y el uso de una línea en blanco es sólo que (la respuesta por defecto) Resulta que, por cierto, esta herramienta exportadora tiene su propia contraparte JSON para responder estas preguntas, pero me di cuenta después de que hice esto =).

para ejecutar la secuencia de comandos simplemente en el directorio que desee y ejecute 'sh autocomplete.sh' en la terminal.

En pocas palabras mediante el uso de < < EOL & EOFen combinación con las tuberías de retorno puede responder a cada pregunta de la solicitud de que sea necesario. Cada nueva línea es una nueva respuesta.

Mi ejemplo simplemente muestra cómo se puede hacer esto con los comentarios que también usan el carácter `para que recuerde qué es cada paso.

Tenga en cuenta que la otra ventaja de este método es que puede responder con más de Y o N ... ¡de hecho puede responder con espacios en blanco!

Espero que esto ayude a alguien.

+1

Háganme saber por qué el voto a la baja, esto tomó mucho tiempo para descubrir que esta era la respuesta (y fue solo una respuesta en mi caso). Lo puse aquí para compartirlo con la comunidad y debería estar en blanco para el preguntador. "¿Es posible tener un script bash que maneje automáticamente las solicitudes que normalmente se presentarían al usuario con acciones predeterminadas?", Sí, usar lo que tengo arriba es un método para hacerlo. –

Cuestiones relacionadas