我希望让一些组织能够在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的所有消息。
感谢您的投入!
答案 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"