web-dev-qa-db-fra.com

Comment puis-je répondre automatiquement aux invites d'un script Linux Bash?

Je lance un script (je ne peux pas le modifier) ​​et il y a trois questions oui/non. Comment puis-je répondre automatiquement à ces questions? Je dois répondre oui, oui, non (dans cet ordre).

9
Ron

Essaye ça:

echo -e "yes\nyes\nno" | /path/to/your/script

De help echo:

-e: permet d'interpréter les échappements de barre oblique inverse suivants

13
Cyrus

Tuyau vers entrée standard

Certains scripts peuvent recevoir des réponses de l'entrée standard. L'une des nombreuses façons de procéder serait:

$ printf "%s\n" yes yes no | ./foo.sh 
yes yes no

C'est simple et facile à lire, mais cela dépend de la façon dont vos internes de script gèrent l'entrée standard, et si vous ne pouvez pas modifier le script cible, cela peut parfois être un problème.

Utiliser Expect pour les invites interactives

Bien que vous puissiez parfois vous en sortir en utilisant une entrée standard, les invites interactives sont généralement mieux gérées par des outils tels que Expect . Par exemple, étant donné un script foo.sh , vous pouvez écrire foo.exp pour l'automatiser.

Remarque: Vous pouvez également utiliser autoexpect pour créer un script à partir d'une session interactive, que vous pouvez ensuite modifier si nécessaire. Je le recommande vivement aux personnes nouvelles à Expect.

Script de bash: foo.sh

Il s'agit du script que vous souhaiterez peut-être automatiser.

#!/usr/bin/env bash
for question in Foo Bar Baz; do
    read -p "${question}? "
    replies=("${replies[@]}" "$REPLY")
done
echo "${replies[@]}"

Script attendu: foo.exp

Voici un script Expect simpliste pour automatiser le script Bash ci-dessus. Les boucles, les branchements et les expressions régulières attendus peuvent fournir beaucoup plus de flexibilité que cet exemple simplifié ne le montre, mais il montre à quel point un script Expect minimal peut être facile!

#!/usr/bin/env expect
spawn -noecho /tmp/foo.sh
expect "Foo? " { send -- "1\r" }
expect "Bar? " { send -- "2\r" }
expect "Baz? " { send -- "3\r" }
interact

Exemple de session interactive

Voici à quoi ressemblera votre session interactive lorsque vous exécuterez le script Expect. Il engendrera votre script Bash et répondra comme indiqué à chaque invite différente.

$ /tmp/foo.exp 
Foo? 1
Bar? 2
Baz? 3
1 2 3
10
Todd A. Jacobs