2009-07-28 119 views
2

我正在使用VMD(分子動力學可視化包),我想從Perl腳本中打開VMD,運行Tcl腳本,將輸出結果打印到日誌文件中,然後關閉VMD並返回到Perl腳本。普通語法要做到這一點:從Bourne Shell執行TCL腳本的問題(重定向問題)

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完成
  • > LOG VMD將終止:寫粗壯提交<LOG>

現在,這將很好地工作,但我的Tcl腳本來接受參數。我今天準備喜歡做的是一樣的東西:

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

然而,在這種情況下,外殼試圖讀取字符串1和字符串的文件。由於我對重定向的理解有限,我不確定究竟是第一行發生了什麼,第二行發生了什麼錯誤,或者什麼是好的解決方案。任何幫助,將不勝感激。

回答

1

對不起,不要以爲你可以直接傳遞參數給你的Tcl腳本,當它在另一個程序如vmd中執行時。我建議通過文件傳遞參數作爲解決方法。例如。 在Perl腳本,調用VMD之前,將參數寫入到Tcl的語法文件:

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

然後在program.tcl的開始,而不是使用命令行參數($ argv的),有它讀參數文件拿起參數值:

source myparams.tcl 
+0

完美,我不知道`源`。我有VMD命令在一個循環內部運行,我認爲每次都必須重寫整個Tcl腳本;這樣好多了。太糟糕了,沒有辦法直接傳遞參數。 – daltonb 2009-07-28 14:04:01

0

你在做什麼是發送內容program.tcl文件到vmd,執行程序的不輸出。如果我理解你,你要連接的TCL程序,用管子到vmd:

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

編輯:

所以,如果VMD標準輸入讀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 str1\n", "set arg2 str2\n"; 
open $fh, '|-', 'vmd ... > output.file' or die 'msg...'; 
print $fh join('', @tcl); 
close $fh or die 'msg...'; 
+0

在這種情況下,shell會嘗試執行`program.tcl`作爲shell命令。如果我將`./program.tcl arg1 arg2`傳送給VMD,它只會發送輸出。 – daltonb 2009-07-28 14:15:52

0

你可以做這樣的事情

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

確保在program.tcl末尾添加一個quit語句直接傳遞參數給VMD。