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

She*_*van 1 command-line pipe io-redirection

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

例如

$ program | F3
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

你需要在那里定义开始

在某些系统(如 Linux)上使用 TIOCSTI ioctl() 运行程序之前,您可以在按下F3终端设备输入缓冲区时插入终端发送的字符序列:

{
   perl -le 'require "sys/ioctl.ph";
   ioctl(STDIN, &TIOCSTI, $_) for split "","@ARGV"' "$(tput kf3)"
   program
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用类似的expect方法在伪造的终端层中运行您的程序,等待它输出一些提示(或任何指示它已启动到您期望的点),然后发送该输出:

expect -c 'spawn -noecho program; expect {>} {send [exec tput kf3]}; interact'
Run Code Online (Sandbox Code Playgroud)

(这里期待一个>提示,替换为一些program在准备好读取输入时输出的字符串)。

您也可以用管道替换它的标准输入,但如果该应用程序需要F3按键之类的东西,它很可能是一个交互式应用程序,因此当它的标准输入不是终端时可能不会喜欢它。无论如何,您始终可以尝试一下:

tput kf3 | program
Run Code Online (Sandbox Code Playgroud)

但是,在program读取 的输出后tput,它将看到文件结尾(没有更多可读取的内容),这可能会导致它退出。和:

{ tput kf3; cat; } | program
Run Code Online (Sandbox Code Playgroud)

我们发送 的输出,kf3然后用于cat将您在终端上键入的所有内容转发到program。再说一次,它不太可能工作,因为很可能program会将终端置于一种模式,即一旦您键入并禁用echo它就无法发送输入,因为它的输入不是终端。

你可以自己做同样的设置:

saved_settings=$(stty -g)
stty -icanon -echo min 1 time 0
{ tput kf3; cat; } | program
stty "$saved_settings"
Run Code Online (Sandbox Code Playgroud)