Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从脚本向程序提供STDIN_Linux_Bash_Shell_Sh - Fatal编程技术网

Linux 从脚本向程序提供STDIN

Linux 从脚本向程序提供STDIN,linux,bash,shell,sh,Linux,Bash,Shell,Sh,我有一个程序在STDIN上等待命令。准备接受这些命令大约需要2秒钟,每次命令后至少需要1秒钟的延迟 到目前为止,我已经尝试在我的脚本内 ./myprogram << EOF command1 command2 command3 EOF /myprogram您可以尝试以下方法: ( sleep 2 echo command1 sleep 1 echo command2 sleep 1 echo command3 sleep 1 ) | ./myp

我有一个程序在STDIN上等待命令。准备接受这些命令大约需要2秒钟,每次命令后至少需要1秒钟的延迟

到目前为止,我已经尝试在我的脚本内

./myprogram << EOF
command1
command2
command3
EOF
/myprogram您可以尝试以下方法:

 ( sleep 2
   echo command1
   sleep 1
   echo command2
   sleep 1
   echo command3
   sleep 1 ) | ./myprogram

或者查看命令。

在命令之间使用
sleep 1
,您可以尝试以下操作:

./myprogram << EOF
command1
$(sleep 2)
command2
$(sleep 2)
command3
EOF

/myprogram您确定确实需要暂停吗?大多数程序将缓冲输入,并在准备使用前一个命令时无缝运行下一个命令

如果需要暂停,这是
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
文档以了解更多高级功能,例如添加错误处理(如果某些命令失败怎么办?)。

expect工作得很好!谢谢,这最终是最好的解决方案,因为在脚本的末尾,我可以简单地添加“交互”来让用户重新控制。谢谢