web-dev-qa-db-fra.com

Demandez au script bash de répondre aux invites interactives

Est-il possible qu'un script bash gère automatiquement les invites qui seraient normalement présentées à l'utilisateur avec des actions par défaut? Actuellement, j'utilise un script bash pour appeler un outil interne qui affiche des invites à l'utilisateur (demandant Y/N) pour effectuer des actions. Toutefois, le script que je suis en train d'écrire doit être complètement "passif", J'ai besoin d'un moyen d'envoyer Y|N à l'invite pour permettre au programme de continuer à s'exécuter. Est-ce possible?

78
tj111

Ce n'est pas une "complétion automatique", c'est une automatisation. Un outil commun pour ces choses s'appelle Expect .

Vous pourriez également vous en tirer simplement avec une entrée de tuyauterie à partir de yes.

57
unwind

Un simple

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

Cela vous permet de transmettre toute séquence "Y" ou "N" à votre script.

132
Loïc Février

J'ai trouvé que le meilleur moyen d'envoyer des entrées est d'utiliser cat et un fichier texte pour transmettre toutes les entrées dont vous avez besoin.

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

Si vous avez seulement Y pour envoyer: 

$> yes Y |./your_script

Si vous avez seulement N à envoyer: 

$> yes N |./yout_script
11
douardo

Dans ma situation, je devais répondre à certaines questions sans Y ou N mais avec du texte ou en blanc. J'ai trouvé que la meilleure façon de faire cela dans ma situation était de créer un fichier shellscript. Dans mon cas, je l'ai appelé autocomplete.sh

J'avais besoin de répondre à quelques questions pour un exportateur de schémas de doctrine et mon fichier ressemblait à ceci.

-- C'est seulement un exemple --

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

Ce que j’aime dans cette stratégie, c’est que vous pouvez commenter vos réponses et utiliser EOF une ligne vide, c’est cela (la réponse par défaut). En fait, cet outil d’exportateur a sa propre contrepartie JSON pour répondre à ces questions, mais j’ai compris cela après que j’ai fait cela =).

pour exécuter le script, il suffit de se trouver dans le répertoire de votre choix et d’exécuter 'sh autocomplete.sh' dans le terminal.

En bref, en utilisant << EOL & EOF en combinaison avec Return Lines vous pouvez répondre à chaque question de l'invite si nécessaire. Chaque nouvelle ligne est une nouvelle réponse.

Mon exemple montre simplement comment cela peut être fait avec des commentaires utilisant également le caractère `afin que vous vous souveniez de chaque étape.

Notez que l'autre avantage de cette méthode est que vous pouvez répondre avec plus que juste Y ou N ... en fait, vous pouvez répondre avec des blancs!

J'espère que cela aide quelqu'un.

6
Joseph Astrahan

Il existe un utilitaire spécial pour cela - ' oui '.

Pour répondre à toutes les questions avec la même réponse, vous pouvez exécuter 

yes [answer] |./your_script

Ou vous pouvez le mettre dans votre script avoir une réponse spécifique à chaque question

0
Asaf Pinhassi