如何通过管道发送标准输入

如何通过管道发送标准输入

我需要在程序启动后立即发送标准输入或键码。

例如

$ 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"

相关内容