C Shell:如何使用非命令行参数执行程序?
题
我的$ SHELL是tcsh。我想运行一个c shell脚本,它会多次调用一个程序,每次更改一些参数。我需要调用的程序是在Fortran中。我不想编辑它。程序只有在执行后才会获取参数,但不会在命令行中获取。在脚本中调用程序后,程序将获得控制权(这是我当前卡住的地方,我永远无法离开,因为脚本在程序进程停止之后才会执行任何操作);此时我需要传递一些变量,然后经过几次迭代后我需要从程序中按ctrl-c继续编写脚本。
如何做到这一点?
解决方案
要添加@Toybuilder所说的内容,您可以使用<!> quot; here document <!> quot;。即你的脚本可以有
./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扩展 - 我只使用了<=>类型<!>;这里文档<!>“;自己。
其他提示
您想要使用的是期待。
嗯,你能用重定向来提供你的Fortran代码吗?您可以使用输入创建临时文件,然后使用stdin重定向(<!> lt;)将其传入。
不是tcsh
用户,但如果程序运行,则通过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
第一次尝试它时它没有工作,但是在我对代码的那一部分中的所有空白区域进行了退格后,我删除了<!>“<!> <<; <!>之间的空格LT; <!> QUOT;和<!>“EOF <!>”;我还退回了结束<!>“EOF <!>”;一直到左边距。之后它起作用了:
foreach f ($forecastTimes)
custom_command <<EOF
arg1=x$f;2
arg2=ya
arg3=z,z$f
run
exit
EOF
end