Haga que bash script responda instrucciones interactivas

¿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 progtwig continúe la ejecución. es posible?

Esto no es “autocompletar”, esto es automatización. Una herramienta común para estas cosas se llama Esperar .

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

Un simple

 echo "YYNNYNYYN" | ./your_script 

Esto le permite pasar cualquier secuencia de “S” o “N” a su secuencia de comandos.

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

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

Si solo tiene Y para enviar:

 $> yes Y |./your_script 

Si solo tiene N para enviar:

 $> yes N |./yout_script 

En mi situación, necesitaba responder algunas preguntas sin Y 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 doctrinel para que mi archivo se viera así.

Este es solo 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 puedes comentar cuáles son tus respuestas y usar EOF es una línea en blanco (la respuesta predeterminada). 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 el script simplemente debe estar en el directorio que desea y ejecutar 'sh autocomplete.sh' en la terminal.

En resumen, al utilizar << EOL & EOF en combinación con Return Lines , puede responder a cada pregunta del prompt según sea necesario. Cada nueva línea es una nueva respuesta.

Mi ejemplo solo 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.