如何在TCL中检查stdin是否待处理?

时间:2012-01-06 08:08:41

标签: buffer tcl stdin

请考虑以下代码:

chan configure stdin -blocking false
while { true } {
    chan gets stdin
    if { chan blocked stdin } { break }
}

此处在循环的最后一行chan blocked stdin在两种情况下都返回true:当stdin处没有其他输入可用时,stdin处有一些输入可用,但它不以换行符结尾。我需要区分这两种情况。

我该怎么做?

在这两种情况下,

chan pending input stdin也会返回0


以下是使用上述代码的上下文。

proc prompt { } { puts -nonewline stdout "MyShell > "; flush stdout }

proc evaluate { } \
{
    chan configure stdin -blocking false
    while { true } {
        # for "stdin -blocking false" "read stdin" acts like "gets stdin"
        set part [chan read stdin 100]
        append command $part
        if { $part eq "" } { break }
    }
    chan configure stdin -blocking true
    # Here I want test if there are pending characters at stdin,
    # and while so, I want to wait for newline character.
    # It should be like this:
    # while { *the required test goes here* } {
    #    append command [chan gets stdin]\n
    # }
    while { ! [info complete $command] } { 
        append command [chan gets stdin]\n
    }
    catch { uplevel #0 $command } got
    if { $got ne "" } {
        puts stderr $got
        flush stderr
    }
    prompt
}

chan event stdin readable evaluate 
prompt
while { true } { update; after 100 }

1 个答案:

答案 0 :(得分:2)

使用事件循环运行交互式命令解释器是非常可能的,并在Tcler的Wiki上描述in some detail。但是,如果您真的只是运行Tcl命令,那么您应该考虑使用commandloop中的TclX package命令,因为它会为您处理详细信息。