Simulation d'une pression sur la touche ENTER dans un script bash

97

J'ai créé un script bash très simple qui exécute quelques commandes. l'une de ces commandes nécessite une entrée de l'utilisateur pendant l'exécution. c'est-à-dire qu'il demande à l'utilisateur "voulez-vous bla bla bla?", je veux simplement envoyer une touche de saisie à ceci afin que le script soit complètement automatisé.

Je n'aurai pas à attendre l'entrée ou quoi que ce soit pendant l'exécution, il suffit d'envoyer simplement la touche et le tampon d'entrée gérera le reste.

tobbr
la source
1
Si l'outil que vous essayez d'automatiser est apt-get, la solution appropriée est de préconfigurer la base de données debconf avec vos valeurs préférées; alors il ne vous le demandera pas.
tripleee
Vous pouvez utiliser printf au lieu de echo: printf "hello \ n"
hassanzadeh.sd

Réponses:

133
echo -ne '\n' | <yourfinecommandhere>

ou profiter de la nouvelle ligne implicite que l'écho génère (merci Marcin)

echo | <yourfinecommandhere>

Maintenant, nous pouvons simplement utiliser l' --skoption:

--sk, --skip-keypressN'attendez pas d'appuyer sur une touche après chaque test

c'est à dire sudo rkhunter --sk --checkall

Tilman Vogel
la source
1
si vous alimentez cette sortie, xxdvous obtenez 5c6ehex, qui est un littéral \n. si vous faites juste, echo | xxd vous vous retrouvez avec un hexagone de 0a. Donc, je suppose que vous utilisez ce dont votre programme a besoin.
Marcin
3
@Marcin, je suis surpris, j'obtiens 0a0ace qui n'est toujours pas comme prévu, l'ajout d'un -nsupprime le saut de ligne implicite. Mais vous avez bien sûr raison, une plaine echo | ...fonctionne bien ici. Mettra à jour ma réponse.
Tilman Vogel
Hé, ça ne me semblait pas tout à fait normal, alors j'ai dû le nourrir via xxd. C'est de loin la méthode la plus simple mais efficace pour voir exactement quelles commandes sont générées. Je dois aimer les trucs Unix stupides.
Marcin
@Marcin, encore, pourquoi avez-vous 5c6e? Avez-vous omis -eou votre shell echotraite-t-il ou non cette option?
Tilman Vogel
je reçois: echo -ne "\n" | xxd 0000000: 0a et echo -n "\n" | xxd 0000000: 5c6e et echo "\n" | xxd 0000000: 5c6e 0a je n'ai vu aucune différence entre les guillemets simples et doubles. Mon shell est juste une bash régulière, y a-t-il des paramètres qui réguleraient le comportement de ces fonctionnalités de base?
Marcin
43

Vous pourriez trouver la yescommande utile.

Voir man yes

Pavium
la source
55
yesJe trouve cela utile.
Pureferret
2
Cela simule une pression répétée sur "y" plutôt que sur la touche Entrée. Bien que ce soit probablement ce que vous voulez pour les questions oui / non, cela ne fonctionnera pas pour tout ce qui n'attend pas un "y".
Burhan Ali
5
@BurhanAli: vous pouvez changer ce qui yesenvoie comme sortie. Lisez la page de manuel.
siride
1
puis-je envoyer oui plusieurs fois pour un script qui attend des valeurs par défaut [valeur] {entrée}
AK_
Cela ne fonctionne que pour des choses comme miam. Où cette chaîne est attendue.
einarc
35

Vous pouvez simplement utiliser oui .

# yes "" | someCommand
David Hamner
la source
22

Voici un exemple d'utilisation utilisant expect:

#!/usr/bin/expect
set timeout 360
spawn my_command # Replace with your command.
expect "Do you want to continue?" { send "\r" }

Vérifiez: man expectpour plus d'informations.

Kenorb
la source
particulièrement utile si plusieurs touches de saisie doivent être envoyées
Andy
C'est le meilleur moyen, spécialement pour des choses comme les phars où différentes chaînes stdout et stdin sont envoyées.
einarc
N'oubliez pas de saisir simplement my_command arg si vous avez un argument.
einarc
11

Vous pouvez utiliser expect ( man expect vient avec des exemples).

barti_ddu
la source