Senden von simulierten Tastenanschlägen in Bash

19

Ich habe kürzlich versucht, ein Skript zu schreiben, mit dem ich mein C ++ - Programm in 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 einer Eingabe (CR).

Das zweite Beispiel sendet Alt-A

Ich versuche speziell, dies in Bash zu tun . Keine andere Skriptsprache ist dafür geeignet

Auch würde ich einen Löffel nicht bevorzugen. Bitte geben Sie an , wie es geschrieben werden soll . Das Schreiben des Skripts ist für mich nicht gestattet.

Ishan
quelle
1
Automatisieren Sie eine Befehlszeile, ncurses oder ein grafisches Programm?
user1686
1
Ich automatisiere gerade eine Kommandozeile. Es soll automatisch Eingaben in Cins (Konsoleneingaben) einspeisen
Ishan

Antworten:

16

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

Im Fall von interaktiven CLI-Programmen ( nicht vollständigen CLI-Programmen ) können Named Pipes oder Coprozesse als eine Art Poor-Man- Programm verwendet werden ( expectwas Sie aufgrund von Tcl ausgeschlossen haben):

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 head -1 <outlesen. Lesen Sie beispielsweise nicht nur eine Zeile, sondern puffern Sie einen vollständigen 4-KB-Block, drucken Sie eine Zeile und verwerfen Sie den Rest.)

user1686
quelle
Beide Antworten sind gleich gut. Aber das ist es, wonach ich mehr suche.
Ishan
Was ist mit CLI-Programm / Vollterminal gemeint?
Chris Stryczynski
CLI steht für Command Line Interface. Ein CLI-Programm ist ein einfaches Programm, das in der Befehlszeile ausgeführt wird und im Allgemeinen stdin und stdout verwendet, wenn es eine Aufgabe ausführt, die Ausführung beendet und zur Eingabeaufforderung zurückkehrt. grepund curlsind gute Beispiele dafür. Ein vollständiges Terminalprogramm ist etwas, das die Kontrolle über das gesamte Fenster übernimmt, wie vimund screen.
Trevin Avery
16

Du suchst nach xdotool .

xdotools Äquivalent zu Ihren Beispielbefehlen lautet:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
Dennis
quelle
das ist gut. aber ich habe über reinen Bash-Code nachgedacht
Ishan
9
@Ishan: Es ist praktisch unmöglich, solche Dinge mit reinem Bash-Code zu tun . Bash kann X11 nicht direkt verwenden und es kann auch keine vorhandene X11-Bibliothek verwenden. Sie müssten sich direkt mit dem X11-Socket verbinden (bash führt nur TCP aus, nicht Unix-Sockets), das X11-Protokoll manuell analysieren (das Parsen von Binärdaten in bash schlägt fehl) und die entsprechenden Antworten erstellen. bash ist eine Shell, die durch Verketten externer Tools funktioniert.
user1686