我的 $SHELL 是 tcsh。我想运行一个 C shell 脚本,它会多次调用一个程序,每次都会更改一些参数。我需要调用的程序是 Fortran。我不想编辑它。该程序仅在执行后才接受参数,而不是在命令行上。在脚本中调用程序后,程序将获得控制权(这是我目前卡住的地方,我永远无法脱身,因为在程序进程停止之前脚本不会执行任何操作)。此时我需要向它传递一些变量,然后经过几次迭代后,我需要Ctrl+C退出程序并继续执行脚本。
如何才能做到这一点?
要添加@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”类型。
您要使用的是Expect。
嗯,你能用重定向来输入你的 Fortran 代码吗?您可以使用输入创建一个临时文件,然后使用标准输入重定向 (<) 将其输入。
不是tcsh
用户,但如果程序运行然后通过 then 读取命令,stdin
您可以使用 shell 重定向<
为其提供所需的命令。如果您在后台运行它,&
则执行时不会阻塞。然后你可以sleep
稍等一下,然后使用你拥有的任何工具(ps
, grep
,awk
等)来发现程序的 PID,然后使用kill
它来发送它SIGTERM
,这与执行Ctrl-相同C。
这是 unix 程序期望的工作,它可以很好地轻松地交互式地命令程序并响应它们的提示。
在被告知我的问题几乎与此问题重复后,我被送到了这里。
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