如何通过终端程序模拟发送击键?

如何通过终端程序模拟发送击键?

我需要将击键虚拟发送到终端程序(例如或者emacs)。

我想做这样的事情:

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

然后有一个使用此缓冲区打开会话:

Hello, world!
~
~
~
~
~

但这不起作用不读取击键标准输入

我收到此错误:

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

如何将一些文本字符串发送到终端程序,就像直接在键盘上键入该字符串一样?

答案1

这通常是expect是为:

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

虽然expect是在流行之前perlpython流行之前为 TCL 编写的,但现在类似的模块为了perl或者python也可用。

另一种选择是向 tty 设备发出TIOCSTIioctl,以在其输入队列中插入字符(一次一个字节):

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

这样做的好处是可以避免终端仿真器和应用程序之间存在额外的伪终端层(此处vi)。

答案2

以 @Stéphane Chazelas 的 Perl 示例为基础,以下内容可通过脚本或命令行实用:

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

如果你放弃了决赛应用程序的输出指令将出现在输入队列(在内核中被称为)、当前控制台 shell 或shell编辑命令行的应用程序中。它stty只是停止屏幕上的任何(全双工)回声。

笔记:从技术上讲,这并不是明确的“模拟按键”。

相关内容