1

我希望对在 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 的消息,但现在我想看到两者。有没有办法让从 print 到 stdout 的消息保存到一个 tcl 变量,从 print 到 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 的所有消息。

感谢您的输入!

4

1 回答 1

0

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"
于 2013-10-11T20:41:13.570 回答