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.


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


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


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


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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.