2

我的 $SHELL 是 tcsh。我想运行一个 C shell 脚本,它会多次调用一个程序,每次都会更改一些参数。我需要调用的程序是 Fortran。我不想编辑它。该程序仅在执行后才接受参数,而不是在命令行上。在脚本中调用程序后,程序将获得控制权(这是我目前卡住的地方,我永远无法脱身,因为在程序进程停止之前脚本不会执行任何操作)。此时我需要向它传递一些变量,然后经过几次迭代后,我需要Ctrl+C退出程序并继续执行脚本。

如何才能做到这一点?

4

6 回答 6

5

要添加@Toybuilder 所说的内容,您可以使用“此处文档”。即你的脚本可能有

./myfortranprogram << EOF
first line of input
second line of input
EOF

<<EOF“ ”和“ ”之间的所有内容都EOF将被馈送到程序的标准输入(Fortran 是否仍然使用“read (5,*)”从标准输入中读取?)

而且因为我认为@ehemient 的评论应该出现在答案中:

更多提示: <<'EOF' 防止在 here-doc 正文中插值;<<-EOF 删除所有前导制表符(因此您可以缩进 here-doc 以匹配其周围环境),并且 EOF 可以替换为任何标记。空标记 (<<"") 表示在第一个空行处停止的 here-doc。

我不确定这些的可移植性如何,或者它们是否只是 tcsh 扩展——我自己只使用过<<EOF“here document”类型。

于 2008-10-22T00:33:24.433 回答
2

您要使用的是Expect

于 2008-10-22T00:21:47.683 回答
1

嗯,你能用重定向来输入你的 Fortran 代码吗?您可以使用输入创建一个临时文件,然后使用标准输入重定向 (<) 将其输入。

于 2008-10-22T00:19:05.227 回答
0

不是tcsh用户,但如果程序运行然后通过 then 读取命令,stdin您可以使用 shell 重定向<为其提供所需的命令。如果您在后台运行它,&则执行时不会阻塞。然后你可以sleep稍等一下,然后使用你拥有的任何工具(ps, grep,awk等)来发现程序的 PID,然后使用kill它来发送它SIGTERM,这与执行Ctrl-相同C

于 2008-10-22T00:17:44.527 回答
0

这是 unix 程序期望的工作,它可以很好地轻松地交互式地命令程序并响应它们的提示。

于 2008-10-22T01:19:49.330 回答
0

在被告知我的问题几乎与此问题重复后,我被送到了这里。

FWIW,我在使用 csh C shell 脚本时遇到了类似的问题。

这段代码允许 custom_command 在不获取任何输入参数的情况下执行:

foreach f ($forecastTimes)
    custom_command << EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
        EOF
end

我第一次尝试时它没有用,但是在我退格了该部分代码中的所有空白之后,我删除了“<<”和“EOF”之间的空格。我还将结束的“EOF”一直退到左边距。之后它起作用了:

foreach f ($forecastTimes)
    custom_command <<EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
EOF
end
于 2016-03-29T14:24:58.587 回答