linux - 从脚本向程序提供 STDIN

标签 linux bash shell sh

我有一个程序等待 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/

相关文章:

linux - 在 ubuntu bash 脚本中,当我尝试转换错误的十六进制值时不会抛出任何错误

linux - 为什么 "let"在 Ubuntu 上不能与 "sh myscript"一起使用,而与 "./myscript"一起使用?

Bash:根据一些分隔符拆分字符串并将每个分隔符存储在一个变量中

Linux Server 部署JSP - Http 404 请求的资源不可用

linux - elf 文件自以为小,其实很大!无法生成 .bin 和 .hex 文件

php - WordPress 网站迁移后缺少仪表板

string - 使用 bash 脚本在日志文件中搜索字符串

linux - 如何复制文件及其路径下的所有目录

bash 脚本 : how to "exit" from sourced script, 并允许非源工作?

bash - 使用 GNU find 只显示叶目录