Enviando pressionamentos de tecla simulados no Bash

19

Recentemente, eu 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 de um enter (CR)

O segundo exemplo envia alt-a

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

Além disso, eu não preferiria uma colherada. Por favor, especifique como escrevê-lo . Não é permitido escrever o script para mim.

Ishan
fonte
11
Você está automatizando uma linha de comando, ncurses ou programa gráfico?
usar o seguinte comando
11
Estou automatizando uma linha de comando por enquanto. Supõe-se à entrada de alimentação em (entradas de console) de cin automaticamente
Ishan

Respostas:

16

Para alimentar o texto no stdin de um programa, use pipes 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 os de terminal completo), é possível usar pipes nomeados ou coprocesses como uma espécie de pobre expect(que você descartou 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 a partir do tubo de saída; por exemplo head -1 <out, não lerá apenas uma linha - ele armazenará um bloco completo de 4k, imprimirá uma linha e descartará o restante.)

user1686
fonte
Ambas as respostas são igualmente boas. Mas, é isso que eu mais procuro.
Ishan
O que se entende por programa CLI / terminal completo?
Chris Stryczynski
CLI significa Command Line Interface. Um programa CLI é um programa simples que é executado na linha de comandos e geralmente usa stdin e stdout, pois executa alguma tarefa e, em seguida, termina a execução e retorna ao prompt da linha de comandos. grepe curlsão bons exemplos disso. Um programa de terminal completo é algo que assume o controle de toda a janela, como vime screen.
Trevin Avery
16

Você está procurando pelo xdotool .

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

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
Dennis
fonte
isso é bom. mas eu estava pensando em algum código do bash puro
Ishan
9
@ Ishan: É praticamente impossível fazer essas coisas com o código bash puro . O Bash não pode usar o X11 diretamente e também não pode usar nenhuma biblioteca X11 existente. Você precisaria se conectar diretamente ao soquete X11 (o bash faz apenas TCP, não soquetes do Unix), analisa o protocolo X11 manualmente (a análise de dados binários no bash está destinada a falhar) e cria as respostas apropriadas. O bash é um shell, foi projetado para funcionar encadeando ferramentas externas.
usar o seguinte comando