Envoi de frappes simulées dans Bash

19

J'ai récemment essayé d'écrire un script qui peut être utilisé pour automatiser mon programme c ++ en bash. Si vous connaissez AutoIt, je peux simplement vous montrer un exemple de ce que j'essaie de faire:

send("1{enter}")

ou

send("!a")

OK Pour ceux qui ne parlent pas AutoIt:

Le premier exemple envoie une frappe simulée "1" suivie d'une entrée (CR)

Le deuxième exemple envoie alt-a

J'essaie spécifiquement de le faire en bash . Aucun autre langage de script ne fera l'affaire

De plus, je ne préférerais pas une cuillère à soupe. Veuillez préciser comment l'écrire . Il n'est pas permis d'écrire le script pour moi.

Ishan
la source
1
Êtes-vous en train d'automatiser une ligne de commande, ncurses ou un programme graphique?
user1686
1
J'automatise une ligne de commande pour l'instant. Il est censé alimenter automatiquement les entrées cin (entrées console)
Ishan

Réponses:

16

Pour insérer du texte dans le stdin d'un programme, utilisez des canaux et / ou la redirection :

echo 1 | myprogram

(echo "First line"
 echo "Second line") | myprogram

myprogram <<EOF
First line
Second line
EOF

Dans le cas de programmes CLI interactifs ( pas de terminaux complets), il est possible d'utiliser des canaux nommés ou des coprocessus comme une sorte de pauvre expect(ce que vous avez exclu en raison de son statut Tcl):

mkfifo in out
myprogram <in >out &
echo "First line" >in
read -r reply <out

mkfifo in out
myprogram <in >out &
exec {infd}>in {outfd}<out
echo "First line" >&$infd
read -r reply <&$outfd

coproc foo { myprogram; }
echo "First line" >&${foo[1]}
read -r reply <&${foo[0]}

(Soyez prudent lorsque vous lisez à partir du tube de sortie; par exemple head -1 <out, ne lira pas seulement une ligne - il tamponnera un bloc 4k complet, imprimera une ligne, éliminera le reste.)

user1686
la source
Les deux réponses sont également bonnes. Mais c'est ce que je recherchais le plus.
Ishan
Qu'entend-on par programme CLI / terminal complet?
Chris Stryczynski
CLI signifie Command Line Interface. Un programme CLI est un programme simple qui s'exécute sur la ligne de commande et utilise généralement stdin et stdout car il effectue une tâche, puis termine l'exécution et revient à l'invite de ligne de commande. grepet en curlsont de bons exemples. Un programme de terminal complet est quelque chose qui prend le contrôle de la fenêtre entière, comme vimet screen.
Trevin Avery
16

Vous recherchez xdotool .

L'équivalent de xdotool de vos exemples de commandes est:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
Dennis
la source
c'est bon. mais je pensais à un code bash pur
Ishan
9
@Ishan: Il est pratiquement impossible de faire de telles choses avec du code bash pur . Bash ne peut pas utiliser X11 directement et il ne peut pas non plus utiliser de bibliothèque X11 existante. Vous devez vous connecter directement au socket X11 (bash ne fait que TCP, pas les sockets Unix), analyser le protocole X11 à la main (l'analyse des données binaires dans bash est vouée à l'échec) et créer les réponses appropriées. bash est un shell, il est conçu pour fonctionner en chaînant des outils externes.
user1686