如何在交互式程序中使用输入重定向和手动输入?

How can I use input redirection AND manual input in an interactive program?

我有一个程序的可执行文件,用 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

因此,它没有等待我的键盘输入,而是检测到文件的结尾并且程序崩溃了。 我可以做些什么吗?

你可以做的是制作一个输出所有输入的 .sh 文件(你还在和我在一起吗?:),请求用户输入然后输出:

echo hello
echo world
read input
echo $input

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

如果你可以要求用户预先输入第 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

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