我需要在程序启动后立即发送标准输入或键码。
例如
$ program | F3
答案1
你需要定义开始那里。
F3
当您按下终端设备输入缓冲区时,您可以插入终端发送的字符序列前在 Linux 等某些系统上使用 TIOCSTI ioctl() 运行程序:
{
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "","@ARGV"' "$(tput kf3)"
program
}
或者您可以使用类似的方法expect
在伪造的终端层中运行您的程序,等待它输出一些提示(或任何表明它是开始了直到您期望的程度),然后发送该输出:
expect -c 'spawn -noecho program; expect {>} {send [exec tput kf3]}; interact'
(这里期待一个提示,替换为准备好读取输入时输出的>
一些字符串)。program
您还可以将其标准输入替换为管道,但如果该应用程序需要F3按键之类的操作,那么它很可能是一个交互式应用程序,因此当它的标准输入不是终端时,它可能会不喜欢它。无论如何,你总是可以尝试一下:
tput kf3 | program
然而,在program
读取 的输出后tput
,它将看到文件结尾(没有更多内容可读取),这可能会导致它退出。和:
{ tput kf3; cat; } | program
我们发送 的输出kf3
,然后用于cat
将您在终端上输入的所有内容转发到program
。话又说回来,它不太可能工作,因为很可能program
会将终端置于一种模式,在这种模式下,只要您键入并禁用它就echo
无法再执行的操作,因为它的输入不是终端。
您可以自己做同样的设置:
saved_settings=$(stty -g)
stty -icanon -echo min 1 time 0
{ tput kf3; cat; } | program
stty "$saved_settings"