从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
语句。
上一篇: Problem executing TCL script from Bourne Shell (redirection trouble)
下一篇: Spring not recognising some @Configuration and @Component classes