我有一个程序等待 STDIN 上的命令。准备接受这些命令大约需要 2 秒,并且每个命令之后至少需要有 1 秒的延迟。
到目前为止,我已经在我的脚本中尝试过。
./myprogram << EOF
command1
command2
command3
EOF
上述内容有时取决于程序启动所需的时间以及命令执行所需的时间。
最佳答案
您确定真的需要暂停吗?大多数程序都会缓冲输入,并在准备好前一个命令时无缝运行下一个命令。
如果需要暂停,这是expect
的工作。我已经有一段时间没有使用 expect
了,但您想要一个看起来非常像这样的脚本:
spawn myprogram # start your program
sleep 2 # wait 2 seconds
send "command1\r" # send a command
sleep 1
send "command2\r"
sleep 1
send "exit\r"
wait # wait until the program exits
(一个很大的“问题”是每行输入都必须以 \r
结尾(而不是 \n
)。这很容易被忽略。)
但是,这可以改进:如果命令运行时间不到一秒,那么您就会浪费时间。或者有时命令花费的时间可能比预期的要长。由于大多数交互式程序都会显示某种提示,因此最好将其用作提示。 Expect 使这变得非常容易。对于此示例,我假设您的程序在准备好接受新命令时打印“Ready>”。
spawn myprogram
expect "Ready>"
send "command1\r"
expect "Ready>"
send "command2\r"
expect "Ready>"
send "exit\r"
wait
您必须查阅expect
文档以获取更多高级功能,例如添加错误处理(如果某些命令失败怎么办?)。
关于linux - 从脚本向程序提供 STDIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24513864/