Como emular o envio de pressionamentos de teclas por meio de um programa do terminal?

1

Eu preciso enviar pressionamentos de teclas virtualmente para um programa terminal (como vi ou emacs ).

Eu quero fazer algo assim:

echo -e 'iHello, world!\e' | vi

e, em seguida, abra uma sessão vi com este buffer:

Hello, world!
~
~
~
~
~

Mas isso não funciona porque o vi não lê as teclas digitadas através do stdin .

Eu recebo este erro:

ex/vi: Vi's standard input and output must be a terminal

Como posso enviar uma string de texto para um programa terminal como se a string fosse digitada diretamente em um teclado?

    
por wefwefa3 23.10.2015 / 22:07

2 respostas

8

Isso é normalmente o que expect foi escrito para:

expect -c 'spawn -noecho vi; send "iHello World!\r"; interact'

Embora expect tenha sido escrito para o TCL nos dias anteriores a perl ou python sendo popular, agora módulos semelhantes para perl ou python também estão disponíveis.

Outra opção é emitir TIOCSTI ioctls para seu dispositivo tty para inserir caracteres (um byte de cada vez) em sua fila de entrada:

perl -le 'require "sys/ioctl.ph";
          ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
         ' $'iHello World!\r\e'; vi

Isso tem o benefício de evitar uma camada extra de pseudo-terminal entre o emulador de terminal e o aplicativo (aqui vi ).

    
por 23.10.2015 / 22:13
0

Com base no exemplo Perl de @ Stéphane Chazelas, o seguinte é prático a partir de um script ou linha de comando:

stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' '_cmds_' ;stty echo; _app_

Se você soltar o aplicativo final , a saída de cmds estará presente na fila de entrada (como é chamado no kernel), no seu console atual ou no aplicativo que shell da linha de comando. O stty apenas interrompe qualquer eco (full-duplex) na tela.

Nota: tecnicamente, isso não é explicitamente "simular o pressionamento de tecla".

    
por 25.11.2017 / 01:29