我的$ 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一点,然后使用你拥有的任何工具(psgrepawk等)来发现程序的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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top