将STDOUT和STDERR的消息分配给TCL变量

时间:2013-10-11 17:06:06

标签: perl tcl stdout stderr

我希望让一些组织能够在Windows中的TCL脚本中执行命令的输出。情况是我有一个最终调用perl脚本的tcl脚本。像这样:

perl脚本将结果输出到stdout和stderr:

#print message to STDOUT by default
print "process A running ...";
...
if ($fail) {
    #print to STDERR
    print STDERR "Process A failed.";
}   

最初,我想从tcl脚本中看到的是从打印到STDERR的消息,但现在我想看到两者。有没有办法让打印到stdout的消息保存到一个tcl变量,打印到stderr的消息保存在另一个tcl变量中?这是我尝试使用tcl来实现的:

puts "Running perl script ..."
catch {[set stdout_var [exec perl C:/myScript.pl >@stdout]]} err_msg
puts "\n\nerrmsg:\n$err_msg"
puts "\n\nstdout:\n$stdout_var"

这样做,我只得到在err_msg变量中打印到STDERR的消息(所以我在那里),但是,stdout_var变量永远不会被设置为任何东西。我希望将它设置为STDOUT的消息,但事实并非如此。如果我删除> @stdout,则仍然没有分配stdout_var,并且err_msg包含打印到STDERR和STDOUT的所有消息。

感谢您的投入!

1 个答案:

答案 0 :(得分:0)

有一个例子here on the Tcl wiki

 puts "Running perl script ..."

 set pipe [open "| perl C:/myScript.pl"]
 set standard_output [read -nonewline $pipe]
 set exit_status 0
 if {[catch {close $pipe} standard_error] != 0} {
     global errorCode
     if {"CHILDSTATUS" == [lindex $errorCode 0]} {
         set exit_status [lindex $errorCode 2]
     }
 }
 puts "exit status: $exit_status"
 puts "\n\nstdout:\n$standard_output"
 puts "\n\nstderr:\n$standard_error"