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í.


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).


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.