【问题标题】:How can I use input redirection AND manual input in an interactive program?如何在交互式程序中使用输入重定向和手动输入?
【发布时间】:2015-03-05 04:02:58
【问题描述】:

我有一个程序的可执行文件,用 Fortran 编写,需要交互式输入,例如 20 个输入。我想要的是通过输入重定向提供前 19 个输入,但最后一个来自我的键盘。原因是当我运行程序时我收到一条消息

file list_wall.dat written - modify it to group walls
modify wallList.dat (add flag type) - enter 1 when ready

所以在我按 1 之前,我需要手动修改一个文件,然后手动按 1。我试过这样运行它

./my_interactive_program < input.in

我在这个 input.in 文件中写入了前 19 行。 但是,当它到达最后一行时,我会收到这样的消息:

$forrtl: severe (24): end-of-file during read, unit -4, file stdin

因此,它不会等待我从键盘输入,而是检测到文件的结尾并且程序崩溃。 我能做点什么吗?

【问题讨论】:

  • 我想在 Bash 中读取输入,然后将两者都通过管道传输到您的程序不是一种选择?

标签: bash input io-redirection


【解决方案1】:

如果您可以预先向用户询问第 20 次输入:

read -p "input 20: " inp
{ cat input.in; echo "$inp"; } | ./my_interactive_program

否则,expect 是你可以使用的大锤:

expect <<'END'
spawn ./my_interactive_program
set fh [open input.in r]
while {[gets $fh line] != -1} {
    send -- "$line\r"
}
close $fh
interact
END

【讨论】:

  • 我已经尝试了这里提到的所有方法,但没有任何效果。 “期望”似乎很有希望,但它不可用。我安装了它并尝试运行上面提到的一段代码,但它似乎没有开始工作......它只打印: "spawn ./my_interactive_program" 。我不知道出了什么问题。我还尝试仅在没有任何输入的情况下启动程序,但这也不起作用。有任何想法吗?非常感谢。
【解决方案2】:

你可以做一个 .sh 文件,输出所有输入(你还在我身边吗?:),要求用户输入,然后输出:

echo hello
echo world
read input
echo $input

然后运行该 .sh 文件并通过您的 fortran 程序通过管道输出。

【讨论】:

  • 谢谢,但我认为这不会有帮助。我已经修改了原始问题,所以现在我想做什么以及为什么需要它可能更清楚了。
  • 如果你用'cat input.in'替换前两个回声,你会得到你需要的,我想。
【解决方案3】:

自动化交互式程序的灵活工具是expect。您可以使用它将任意输入(例如,从文件中读取并计算行数)提供给您的 fortran 程序。到达提示符后,您发出命令 interact 并期望将控制权传递给终端的标准输入。

【讨论】:

  • 我尝试使用上面建议的代码,但我又遇到了问题。当我从终端的命令行运行它时,一切运行正常。但是,当我将此添加到 bash 脚本时,它不会运行...请注意,我不包括“
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 2012-07-13
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2013-05-06
相关资源
最近更新 更多