Préparer les réponses aux questions d'une commande

14

Disons que je veux écrire un script shell qui exécute une seule commande. Mais cette commande est mal conçue. Il n'offre aucune option de ligne de commande; à la place, il pose quelques questions et attend la saisie de l'utilisateur.

Existe-t-il un moyen de préparer cette entrée dans le script, de sorte que les questions reçoivent une réponse automatiquement?

tmuecksch
la source

Réponses:

16

Si la commande n'est pas très pointilleuse, elle devrait fonctionner avec quelque chose comme ceci:

command > /dev/null << EOF
<answer 1>
<answer 2>
<answer 3>
EOF

Cela nécessite que vous connaissiez au préalable les réponses exactes.

Bjorn Munch
la source
Vous pouvez utiliser la réponse ci-dessus pour concevoir un script d'habillage. Le nouveau script doit écouter les paramètres et appeler l'ancienne commande avec la méthode ci-dessus.
Walter A
Également connu sous le nom de document ICI, pour plus d'informations, vous pouvez essayer la définition du document Wikipedia ici
OldTimer
15

Attendre peut le faire. Depuis le site Web d' Expect :

Expect est un outil pour automatiser des applications interactives telles que telnet, ftp, passwd, fsck, rlogin, tip, etc. Expect rend vraiment ces choses triviales. Expect est également utile pour tester ces mêmes applications [...] "

Il est livré avec beaucoup d'aide, comme autoexpect .

Encore une fois sur le site Web Expect,

autoexpect vous regarde interagir avec un autre programme et crée un script Expect qui reproduit vos interactions. Pour les scripts simples, autoexpect permet de gagner un temps considérable par rapport à l'écriture manuelle de scripts.

Christophe
la source
Merci pour votre réponse. Étant donné que mes besoins sont très faibles, Expect est exagéré dans mon cas. La réponse de Bjorns convient parfaitement à mes besoins. Mais je suggère de garder votre réponse pour les autres qui ont besoin d'une solution plus complexe.
tmuecksch
+1 parce que je ne savais pas que l'autoexpect existait et que je pensais que la courbe d'apprentissage attendue était trop abrupte pour moi. Je vais jeter un autre regard.
Joe
7

Si votre script attend une réponse ou plusieurs invites dans lesquelles vous pouvez donner la même réponse, il y a yes:

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or `y'.

Utilisez-le comme ceci:

yes Me | give_a_hug.sh
unperson325680
la source
3
Un usage courant mais ironique est yes n, par exemple:yes n | mv -i * somewhere/
Sam Watkins