从Bourne Shell执行TCL脚本时出现问题(重定向问题)

我正在使用VMD(分子动力学可视化包),我想从Perl脚本中打开VMD,运行Tcl脚本,将输出打印到日志文件,然后关闭VMD并返回到Perl脚本。 执行此操作的普通语法是:

system("vmd -dispdev text -eofexit < program.tcl > LOG");

按照我的理解,最好如下所示:

  • system(""); :执行包含在引号中的Bourne Shell命令
  • vmd :调用VMD
  • -dispdev text :以文本模式打开VMD
  • -eofexit :在达到STDIN上的EOF时终止VMD
  • < prog.tcl :将prog.tcl设置为STDIN; 当prog.tcl完成时,vmd将会终止
  • > LOG :将STOUT写入文件<LOG>
  • 现在,这将工作完美,除了我的Tcl脚本需要参数。 我想要做的是这样的:

    system("vmd -dispdev text -eofexit < program.tcl string1 string2 > LOG");
    

    但是,在这种情况下,shell会尝试将string1和string2读为文件。 由于我对重定向的理解有限,我不确定第一行中究竟发生了什么,第二行中究竟出了什么问题,或者什么是好的解决方案。 任何帮助,将不胜感激。


    对不起,当它在另一个程序如vmd中执行时,不要认为你可以直接向你的Tcl脚本传递参数。 我建议通过文件传递参数作为解决方法。 例如。 在Perl脚本中,在调用vmd之前,用Tcl语法将参数写入文件中:

    open PARAMS, '>myparams.tcl';
    print PARAMS "set arg1 $string1; set arg2 $string2";
    close PARAMS;
    

    然后在program.tcl的开头,而不是使用命令行参数($ argv),让它读取参数文件来获取参数值:

    source myparams.tcl
    

    你正在做的是将program.tcl文件的内容发送给vmd,而不是执行程序的输出。 如果我理解你,你想用管道将Tcl程序连接到vmd:

    system("program.tcl arg1 arg2 | vmd -... > output.file");
    

    编辑:

    因此,如果vmd读取stdin上的Tcl代码,则仍然可以在不使用临时文件的情况下传递参数:

    system("( echo 'set arg1 str1; set arg2 str2'; cat program.tcl; ) | vmd ... > output_file");
    

    要么

    open my $fh, '<', 'program.tcl';
    my @tcl = <$fh>;
    close $fh;
    unshift @tcl, "set arg1 str1n", "set arg2 str2n";
    open $fh, '|-', 'vmd ... > output.file' or die 'msg...';
    print $fh join('', @tcl);
    close $fh or die 'msg...';
    

    您可以通过执行类似的操作将参数直接传递给VMD

    system(vmd -dispdev text -e program.tcl -args string1 string2 > LOG);
    

    确保在program.tcl的末尾添加一个quit语句。

    链接地址: http://www.djcxy.com/p/67733.html

    上一篇: Problem executing TCL script from Bourne Shell (redirection trouble)

    下一篇: Spring not recognising some @Configuration and @Component classes