Wysyłanie symulowanych naciśnięć klawiszy w Bash

19

Ostatnio próbowałem napisać skrypt, którego można użyć do automatyzacji mojego programu c ++ w bash. Jeśli znasz AutoIt, mogę po prostu pokazać przykład tego, co próbuję zrobić:

send("1{enter}")

lub

send("!a")

OK Dla tych, którzy nie mówią AutoIt:

Pierwszy przykład wysyła symulowane naciśnięcie klawisza „1”, a następnie Enter (CR)

Drugi przykład wysyła alt-a

W szczególności staram się to zrobić w bash . Żaden inny język skryptowy nie zadziała

Również bym nie preferują spoonfeed. Proszę określić, jak to napisać . Pisanie skryptu nie jest dla mnie dozwolone.

Ishan
źródło
1
Czy automatyzujesz wiersz poleceń, ncurses lub program graficzny?
user1686,
1
Na razie automatyzuję wiersz poleceń. Ma on automatycznie wprowadzać dane wejściowe do cin (wejścia konsoli) automatycznie
Ishan

Odpowiedzi:

16

Aby wprowadzić tekst do standardowego programu, użyj potoków i / lub przekierowania :

echo 1 | myprogram

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

myprogram <<EOF
First line
Second line
EOF

W przypadku interaktywnych programów CLI ( nie pełno-terminalowych), można używać nazwanych potoków lub koprocesów jako swego rodzaju biedaka expect(co wykluczyłeś z powodu bycia 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]}

(Uważaj podczas czytania z potoku wyjściowego; np. head -1 <outNie tylko czyta jeden wiersz - buforuje jeden pełny blok 4k, drukuje jeden wiersz, odrzuca resztę.)

użytkownik1686
źródło
Obie odpowiedzi są równie dobre. Ale tego właśnie bardziej potrzebuję.
Ishan
Co oznacza program CLI / pełny terminal?
Chris Stryczyński
CLI oznacza interfejs wiersza poleceń. Program CLI to prosty program, który działa w wierszu poleceń i ogólnie używa stdin i stdout, ponieważ wykonuje pewne zadania, a następnie kończy wykonywanie i wraca do wiersza polecenia. grepi curlsą tego dobrym przykładem. Pełny program terminalowy to coś, co przejmuje kontrolę nad całym oknem, jak vimi screen.
Trevin Avery,
16

Szukasz xdotool .

Odpowiednikami twoich przykładowych poleceń xdotool są:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
Dennis
źródło
to jest dobre. ale myślałem o czystym kodzie
bashowym
9
@Ishan: Praktycznie niemożliwe jest robienie takich rzeczy za pomocą czystego kodu bash . Bash nie może bezpośrednio używać X11 i nie może również używać żadnej istniejącej biblioteki X11. Będziesz musiał połączyć się bezpośrednio z gniazdem X11 (bash robi tylko TCP, a nie gniazda Unix), ręcznie przeanalizuj protokół X11 (parsowanie danych binarnych w bashie nie powiedzie się) i spreparuj odpowiednie odpowiedzi. bash jest powłoką, jest przeznaczony do pracy poprzez łączenie zewnętrznych narzędzi.
user1686,