我的$ SHELL是tcsh。我想运行一个c shell脚本,它会多次调用一个程序,每次更改一些参数。我需要调用的程序是在Fortran中。我不想编辑它。程序只有在执行后才会获取参数,但不会在命令行中获取。在脚本中调用程序后,程序将获得控制权(这是我当前卡住的地方,我永远无法离开,因为脚本在程序进程停止之前不会执行任何操作);此时我需要传递一些变量,然后经过几次迭代后我需要从程序中按ctrl-c继续编写脚本。
如何做到这一点?
答案 0 :(得分:5)
要添加@Toybuilder所说的内容,您可以使用“此处文档”。即你的脚本可以有
./myfortranprogram << EOF
first line of input
second line of input
EOF
“<<EOF
”和“EOF
”之间的所有内容都将被输入到程序的标准输入中(Fortran是否还使用“read(5,*)”来读取标准输入?)
因为我认为@ ephemient的评论值得回答:
更多提示:&lt;&lt;'EOF'阻止 在here-doc体中插值; &lt;&lt; -EOF删除所有前导标签(所以 你可以缩进here-doc来匹配 它的周围环境)和EOF可以 被任何令牌取代。一个空令牌 (&lt;&lt;“”)表示停止的here-doc 在第一个空行。
我不确定那些是多么可移植,或者它们只是tcsh扩展 - 我自己只使用<<EOF
类型“here here”。
答案 1 :(得分:2)
您要使用的是Expect。
答案 2 :(得分:1)
嗯,你能用重定向来提供你的Fortran代码吗?您可以使用输入创建临时文件,然后使用stdin重定向(&lt;)将其传入。
答案 3 :(得分:0)
不是tcsh
用户,但如果程序运行,则通过stdin
读取命令,然后您可以使用shell重定向<
为其提供所需的命令。如果您在后台使用&
运行它,则在执行时不会阻止。然后你可以sleep
一点,然后使用你拥有的任何工具(ps
,grep
,awk
等)来发现程序的PID,然后使用{{1发送它kill
,这与执行ctrl-c相同。
答案 4 :(得分:0)
这是unix程序期望的工作,它可以很好地,轻松地交互式地命令程序并响应它们的提示。
答案 5 :(得分: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
第一次尝试它时它没有工作,但在我退出代码段的所有空格后,我删除了“&lt;&lt;”之间的空格。和“EOF”。我还将关闭的“EOF”一直退回到左边距。之后它起作用了:
foreach f ($forecastTimes)
custom_command <<EOF
arg1=x$f;2
arg2=ya
arg3=z,z$f
run
exit
EOF
end