从 Bourne Shell 执行 TCL 脚本时出现问题(重定向问题)
我正在使用 VMD(分子动力学可视化包),我想从 Perl 脚本打开 VMD,运行 Tcl 脚本,将输出打印到日志文件,然后关闭 VMD 并返回到 Perl 脚本。 执行此操作的普通语法是:
system("vmd -dispdev text -eofexit < program.tcl > LOG");
据我所知,其分解如下:
system("");
:执行引号vmd
中包含的 Bourne Shell 命令:调用 VMD-dispdev text
:以文本模式打开 VMD-eofexit
:当达到 STDIN 上的 EOF 时终止 VMDprog.tcl
:将prog.tcl设置为STDIN; 时终止- vmd 将在
prog.tcl
完成> LOG
:将 STOUT 写入文件
现在,这可以完美工作,只是我的 Tcl 脚本需要参数。 我想要做的事情是这样的:
system("vmd -dispdev text -eofexit < program.tcl string1 string2 > LOG");
但是,在这种情况下,shell 尝试将 string1 和 string2 作为文件读取。 由于我对重定向的理解有限,我不确定第一行到底发生了什么,第二行到底出了什么问题,或者什么是好的解决方案。 任何帮助,将不胜感激。
I am working with VMD (a molecular dynamics visualization package) and I want to open VMD from a Perl script, run a Tcl script, print the output to a log file, then close VMD and return to the Perl script. The ordinary syntax to do this is:
system("vmd -dispdev text -eofexit < program.tcl > LOG");
which breaks down as follows, as best as I understand:
system("");
: executes Bourne Shell commands contained in quotesvmd
: calls VMD-dispdev text
: opens VMD in text mode-eofexit
: terminates VMD when EOF on STDIN is reached< prog.tcl
: setsprog.tcl
as STDIN; vmd will terminate whenprog.tcl
completes> LOG
: writes STOUT to file<LOG>
Now this would work perfectly, except that my Tcl script takes arguments. What I'd like to do is something like:
system("vmd -dispdev text -eofexit < program.tcl string1 string2 > LOG");
however, in this case the shell tries to read string1 and string2 as files. With my limited understanding of redirection, I'm not sure exactly what is going in the first line, what exactly goes wrong in the second, or what a good solution would be. Any help would be appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
抱歉,当 Tcl 脚本在另一个程序(如 vmd)中执行时,您不认为可以直接将参数传递给 Tcl 脚本。 我建议通过文件传递参数作为解决方法。 例如。
在 Perl 脚本中,在调用 vmd 之前,使用 Tcl 语法将参数写入文件:
然后在 program.tcl 的开头,不使用命令行参数 ($argv),而是读取参数文件以获取参数价值观:
Sorry, don't think you can pass arguments to your Tcl script directly when its being executed within another program like vmd. I would suggest passing the parameters via a file as a workaround. Eg.
In the Perl script, before calling vmd, write the parameters to a file in Tcl syntax:
Then at the start of program.tcl, instead of using command line arguments ($argv), have it read the parameter file to pick up the argument values:
将参数直接传递给 VMD 。
您可以通过执行类似确保在
program.tcl
末尾添加quit
语句的操作,You can pass the arguments directly to VMD by doing something like
Make sure to add a
quit
statement at the end ofprogram.tcl
.您所做的是将program.tcl 文件的内容发送到vmd,而不是执行程序的输出。 如果我理解你的意思,你想用管道将 Tcl 程序连接到 vmd:
编辑:
因此,如果 vmd 在 stdin 上读取 Tcl 代码,你仍然可以在不使用临时文件的情况下传递参数:
或者
What you're doing is sending the contents of the program.tcl file to vmd, not the output of executing the program. If I understand you, you want to connect the Tcl program to vmd with a pipe:
Edit:
So, if vmd reads Tcl code on stdin, you can still pass parameters without using a temp file:
or