重定向到stdout的tcl exec结果也需要存储



Lake看看这两行

情况1

set cvsUpdStr [exec cvs -qn upd]

情况2

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

对于第一种情况,cvsUpdStr是命令的输出,但在命令执行期间没有打印出任何内容。对于第二种情况,cvs upd命令输出打印在屏幕上,但cvsUpdStr为空。如何将它们组合起来,以便打印出cvs upd的结果,并将相同的输出存储在cvsUpdStr变量中?

有两种可能性。将其作为管道(使用open |...创建)运行,并通过存储和打印消息来处理传入的消息,或者使用Unixtee实用程序。第二种选择肯定更简单!

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

tee程序将其标准输入发送到其正常标准输出加上命名文件;我们使用CCD_ 9将其发送到当前终端。

但是,请注意,由于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的"文件名"的第一个字符是|,则参数的剩余将被视为用于构建管道的参数列表。)

最新更新