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.