script example ejemplos linux bash automation command-prompt prompt

linux - example - Haz que bash script responda a las preguntas interactivas



script bash linux ejemplos (6)

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


Descubrí que la mejor manera de enviar una entrada es usar cat y un archivo de texto para transmitir cualquier entrada que necesites.

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


En mi situación, necesitaba responder 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 de doctrina, por lo que mi archivo tenía este aspecto.

- 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 en una línea en blanco es solo eso (la respuesta predeterminada). Resulta que, por la forma en que esta herramienta de exportación tiene su propia contraparte JSON para responder a estas preguntas, pero me di cuenta de que después de hacer esto =).

para ejecutar el script, simplemente esté en el directorio que desea y ejecute ''sh autocomplete.sh'' en la terminal.

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

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

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

Espero que esto ayude a alguien.


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

También puede salirse con la entrada de canalización de yes .


Hay un complemento especial para esto: '' yes ''.

Para responder a todas las preguntas con la misma respuesta, puede ejecutar

yes [answer] |./your_script

O puede ponerlo dentro de su guión, tener respuesta específica a cada pregunta.


Si solo tienes Y para enviar:

$> yes Y |./your_script

Si solo tienes N para enviar:

$> yes N |./yout_script


Un simple

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

Esto le permite pasar cualquier secuencia de "Y" o "N" a su script.