Enviar pulsaciones de teclas simuladas en Bash

19

Recientemente he estado tratando de escribir un script que pueda usarse para automatizar mi programa c ++ en bash. Si conoce AutoIt, simplemente puedo mostrarle un ejemplo de lo que estoy tratando de hacer:

send("1{enter}")

o

send("!a")

OK Para aquellos que no hablan AutoIt:

El primer ejemplo envía una pulsación simulada "1" seguida de un enter (CR)

El segundo ejemplo envía alt-a

Estoy tratando específicamente de hacer esto en bash . Ningún otro lenguaje de script servirá

Además, no preferiría una cucharada. Por favor, especifique cómo escribirlo . No se permite escribir el guión para mí.

Ishan
fuente
1
¿Está automatizando una línea de comandos, ncurses o un programa gráfico?
user1686
1
Estoy automatizando una línea de comando por ahora. Se supone que alimenta la entrada a cin (entradas de consola) automáticamente
Ishan

Respuestas:

16

Para alimentar texto en la entrada estándar de un programa, use tuberías y / o redirección :

echo 1 | myprogram

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

myprogram <<EOF
First line
Second line
EOF

En el caso de los programas de CLI interactivos ( no los de terminal completo), es posible usar tuberías o coprocesos con nombre como una especie de pobre expect(lo que descartó por ser 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]}

(Tenga cuidado al leer desde la tubería de salida; por ejemplo head -1 <out, no solo leerá una línea, almacenará un bloque completo de 4k, imprimirá una línea, descartará el resto).

usuario1686
fuente
Ambas respuestas son igualmente buenas. Pero, esto es lo que más buscaba.
Ishan
¿Qué se entiende por programa CLI / terminal completo?
Chris Stryczynski
CLI significa interfaz de línea de comandos. Un programa CLI es un programa simple que se ejecuta en la línea de comando y generalmente usa stdin y stdout mientras realiza alguna tarea y luego finaliza la ejecución y regresa a la línea de comandos. grepy curlson buenos ejemplos de esto. Un programa de terminal completo es algo que toma el control de toda la ventana, como vimy screen.
Trevin Avery
16

Estás buscando xdotool .

El equivalente de xdotool de sus comandos de ejemplo son:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
Dennis
fuente
Esto es bueno. pero estaba pensando en algún código de bash puro
Ishan
99
@ Ishan: Es prácticamente imposible hacer esas cosas con código bash puro . Bash no puede usar X11 directamente, y tampoco puede usar ninguna biblioteca X11 existente. Tendría que conectarse directamente al socket X11 (bash solo hace TCP, no los sockets Unix), analizar el protocolo X11 a mano (el análisis de datos binarios en bash está destinado a fallar) y elaborar las respuestas apropiadas. bash es un shell, está diseñado para funcionar mediante el encadenamiento de herramientas externas.
user1686