2012-09-27 29 views
7

湖看看这两条线TCL EXEC结果重定向到stdout需要存储太

壳体1

set cvsUpdStr [exec cvs -qn upd] 

壳体2

set cvsUpdStr [exec cvs -qn upd >&@stdout] 

对于第一case cvsUpdStr是该命令的输出,但在命令执行过程中没有打印出来。对于第二种情况,cvs upd命令输出打印在屏幕上,但cvsUpdStr为空。如何合并它们,以便它将打印出cvs upd的结果,并且还会在cvsUpdStr变量中存储相同的输出结果?

+0

,你可能会看看tkcvs,因为它已经用Tcl包装了大多数CVS命令。 http://tksvn.tigris.org/source/browse/tksvn/trunk/tkcvs/ – schlenk

回答

4

有两种可能性。将它作为流水线运行(使用open |...创建),并通过存储并打印它们来处理消息,或使用Unix tee实用程序。第二种选择绝对简单!

# I like to spell out “update” in full 
set cvsUpdStr [exec cvs -qn update | tee /dev/tty] 

tee程序发送它的标准输入到其正常的标准输出加上指定的文件;我们使用/dev/tty将其发送到当前终端。

但请注意,由于缓冲其输出,您可能会在cvs的输出中产生长时间延迟。这只是C库的I/O处理向非终端发送输出时的默认行为,如果您立即需要输出,则可能会出现问题。修复此得到相当复杂(你最终使用期望),所以如果你满意的输出是突发性的,只是不要管它...


在Windows上,你需要做它的其他方式。

set pipe [open |[list cvs -qn update] "r"] 
while {[gets $pipe line] >= 0} { 
    append cvsUpdStr "$line\n" ;# Note the \n at the end! 
    puts $line 
} 
close $pipe      ;# Any errors turn up here! 

|[list ...]的结构是在Tcl的条款相当不寻常的,但它是正确的在这种情况下使用。如果你在CVS的东西特别感兴趣(如果“文件名”来open第一个字符是一个|,争论的其余被视为参数列表用于建设管道。)

+0

我在寡妇身边,关于tee我知道,但它在这里没有帮助:( – Narek

+0

“open”的解决方案是什么? .'? – Narek

+0

@Narek尝试更新后的版本。 –