Demander au script bash de répondre aux invites interactives [dupliquer]

109

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 affichera des invites à l'utilisateur (demandant O / N) pour terminer les actions, mais le script que j'écris doit être complètement "sans intervention", donc J'ai besoin d'un moyen d'envoyer Y|Nà l'invite pour permettre au programme de continuer l'exécution. Est-ce possible?

TJ L
la source
ce n'est pas une "autocomplétion" ... comme le dit @unwind, c'est de "l'automatisation"
benzaita
3
Exemple d'utilisation yespour faire ceci: unix.stackexchange.com/questions/47344/…
Droogans

Réponses:

65

Ce n'est pas de la "complétion automatique", c'est de l'automatisation. Un outil commun pour ces choses est appelé Expect .

Vous pourriez également vous en sortir avec une simple entrée de tuyauterie yes.

se détendre
la source
3
Malheureusement, je ne peux pas utiliser expect car leurs exigences d'espace sont strictes sur le système exécutant cela, donc je ne peux pas ajouter de paquets supplémentaires, mais le piping a yesfait l'affaire, heureusement, toutes les invites ne nécessitaient qu'un «y» de toute façon. Merci.
TJ L du
Cependant, Yes | commandcela ne fonctionne pas toujours. Si c'est juste à des fins d'installation, je suis tombé en utilisant -yune option meilleure et préférée.
Umesh Kaushik
169

Un simple

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

Cela vous permet de transmettre n'importe quelle séquence de "Y" ou "N" à votre script.

Loïc Février
la source
3
Si j'avais besoin d'envoyer des NY, j'aurais utilisé cette méthode, mais je n'avais besoin que de Y alors je suis allé avec yes. Dommage que je ne puisse pas accepter deux réponses, car elles sont toutes les deux correctes.
TJ L du
3
;) Eh bien, si jamais vous avez besoin d'en envoyer, Nvous avez maintenant un bon moyen de le faire.
Loïc Février
2
Cela ne fonctionne pas pour moi; les espaces ne comptent pas comme de nouvelles lignes --- si par exemple j'écho "Y N" alors il donne la chaîne "Y N"comme entrée à la première invite et se bloque sur la deuxième invite en attendant que je la complète. J'ai essayé de changer les espaces en nouvelles lignes mais cela n'a pas fonctionné non plus, j'ai quand même donné une chaîne littérale à l'invite.
nom_utilisateur_temporaire
52
essayez d'utiliser printf 'y\ny\ny\n' | ./your_script. De cette façon, vous insérez manuellement la nouvelle ligne pour chaque entrée attendue.
Majid
8
printf '%s\n' Y Y N N Y N Y Y Nmet des retours à la ligne entre les éléments, mais sans avoir besoin d'une chaîne de grand format.
Charles Duffy
16

J'ai trouvé que le meilleur moyen d'envoyer une entrée est d'utiliser cat et un fichier texte pour transmettre toute entrée dont vous avez besoin.

cat "input.txt" | ./Script.sh
Alex
la source
Attendre n'a pas fonctionné comme prévu pour moi. C'est la réponse la plus simple et la meilleure à cette question.
cloudxix
12

Si vous n'avez que Y à envoyer:

$> yes Y |./your_script

Si vous n'avez que N à envoyer:

$> yes N |./your_script
douardo
la source
9

Dans ma situation, j'avais besoin de répondre à certaines questions sans O ou N mais avec du texte ou du blanc. J'ai trouvé que le meilleur moyen 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éma de doctrine, donc mon fichier ressemblait à ceci.

- Ceci est un exemple seulement -

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 est juste cela (la réponse par défaut). Il s'avère que cet outil d'exportateur a son propre équivalent JSON pour répondre à ces questions, mais je l'ai compris après avoir fait ceci =).

pour exécuter le script, soyez simplement dans le répertoire souhaité et exécutez-le 'sh autocomplete.sh'dans le terminal.

En bref, en utilisant << EOL & EOF en combinaison avec les lignes de retour, 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 en 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 Y ou N ... en fait, vous pouvez répondre avec des blancs!

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

Joseph Astrahan
la source
4

Il existe un utilitaire spécial intégré 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 pour avoir une réponse spécifique à chaque question

Asaf Pinhassi
la source
comment puis-je faire cela dans le script? je veux spécifier des réponses différentes pour chaque question
Sengo