it-swarm.com.de

Senden von simulierten Tastenanschlägen in Bash

Ich habe kürzlich versucht, ein Skript zu schreiben, mit dem ichmein C++ - Programmin Bash automatisieren kann. Wenn Sie AutoIt kennen, kann ich Ihnen einfach ein Beispiel dafür zeigen, was ich versuche:

send("1{enter}")

oder

send("!a")

OK Für diejenigen, die AutoIt nicht sprechen:

Das erste Beispiel sendet einen simulierten "1" -Tastenanschlag, gefolgt von einem Enter (CR).

Das zweite Beispiel sendet Alt-A

Ich versuche dies speziell inbash. Keine andere Skriptsprache kann

Außerdem würde ichnichteinen Löffel bevorzugen. Bitte spezifizieren, wie es geschrieben wird . Das Schreiben des Skripts ist für mich nicht gestattet.

18
Ishan

Verwenden Sie Pipes und/oder Umleitungen , um Text in die Standardeingabe eines Programms einzufügen:

echo 1 | myprogram

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

myprogram <<EOF
First line
Second line
EOF

Bei interaktiven CLI-Programmen ( nicht Voll-Terminal-Programmen) können Named Pipes oder Coprozesse als eine Art von Armen verwendet werden -man's expect (was du als Tcl ausgeschlossen hast):

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]}

(Seien Sie vorsichtig, wenn Sie aus der Ausgabepipe lesen. Beispielsweise liest head -1 <out nicht nur eine Zeile, sondern puffert einen vollständigen 4-KB-Block, druckt eine Zeile und verwirft den Rest.)

15
grawity

Sie suchen xdotool .

xdotools Äquivalent zu Ihren Beispielbefehlen lautet:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
16
Dennis