7

湖看看这两条线

情况1

set cvsUpdStr [exec cvs -qn upd]

案例2

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

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

4

1 回答 1

4

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

# 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),所以如果你对输出的突发性感到满意,那就别管它了……</p>


在 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!

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

于 2012-09-27T10:42:03.810 回答