tcl执行结果重定向到stdout也需要被存储

湖一看这两条线

情况1

set cvsUpdStr [exec cvs -qn upd]

情况2

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

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


有两种可能性。 将它作为管道运行(使用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处理向非终端发送输出时的默认行为,如果您立即需要输出,则可能会出现问题。 解决这个问题变得相当复杂(你最终使用了Expect),所以如果你对输出突发感到满意,就把它放在一边吧......


在Windows上,您需要以其他方式来完成。

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

具有|[list ...]的构造在Tcl术语中是非常不寻常的,但在这种情况下它是正确的。 (如果要open的“文件名”的第一个字符是| ,则将参数的其余部分视为用于构建管道的参数列表。)

链接地址: http://www.djcxy.com/p/64237.html

上一篇: tcl exec result redirected to stdout need to be stored too

下一篇: Descriptors : Precendence of Attribute access through