Enviando pressionamentos de tecla simulados no Bash

15

Recentemente, tenho tentado escrever um script que pode ser usado para automatizar meu programa c ++ no bash. Se você conhece o AutoIt, posso simplesmente mostrar um exemplo do que estou tentando fazer:

send("1{enter}")

ou

send("!a")

OK Para quem não fala AutoIt:

O primeiro exemplo envia um pressionamento de tecla "1" simulado seguido por uma entrada (CR)

O segundo exemplo envia alt-a

Estou especificamente tentando fazer isso em bash . Nenhuma outra linguagem de script fará

Além disso, eu não prefiro um spoonfeed. Por favor especifique como escrevê-lo . Não é permitido escrever o roteiro para mim.

    
por Ishan 20.04.2013 / 17:56

2 respostas

11

Para inserir texto no stdin de um programa, use canais e / ou redirecionamento :

echo 1 | myprogram

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

myprogram <<EOF
First line
Second line
EOF

No caso de programas CLI interativos ( não full-terminal), é possível usar pipes nomeados ou coprocessos como uma espécie deexpect (que você excluiu 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]}

(Tenha cuidado ao ler o canal de saída; por exemplo, head -1 <out não lerá apenas uma linha - ele armazenará um bloco inteiro de 4k, imprimirá uma linha, descartará o restante).

    
por 20.04.2013 / 18:42
14

Você está procurando xdotool .

O equivalente de xdotool aos seus comandos de exemplo são:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
    
por 20.04.2013 / 18:26