我需要将击键虚拟发送到终端程序(例如六或者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
是在流行之前perl
或python
流行之前为 TCL 编写的,但现在类似的模块为了perl
或者python
也可用。
另一种选择是向 tty 设备发出TIOCSTI
ioctl,以在其输入队列中插入字符(一次一个字节):
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
只是停止屏幕上的任何(全双工)回声。
笔记:从技术上讲,这并不是明确的“模拟按键”。