She*_*van 1 command-line pipe io-redirection
我需要在程序启动后立即发送标准输入或键码。
例如
$ program | F3
Run Code Online (Sandbox Code Playgroud)
你需要在那里定义开始。
在某些系统(如 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)