答案 0 :(得分:2)
显然,你可以将频道模式设置为非阻塞并从中读取。如果读取返回0长度,则没有可用的内容。但是,我怀疑你的意思是测试存在的数据但不是完整的一行,因为你提到那里的线路缓冲。 fblocked命令为此测试通道。有关详细信息,请参阅fblocked(1),但对于行缓冲通道,这可以让您知道存在不完整的行。
读取stdin时的另一个有用命令,如果您正在阅读交互式脚本命令,则使用info complete命令。有了这个,您可以累积行,直到info complete返回true,然后将整个缓冲区评估为一个。
答案 1 :(得分:0)
您可以使用chan pending input stdin
检查Tcl的输入缓冲区(至少需要Tcl 8.5)。这并不表示操作系统是否在其缓冲区中有任何内容;通过使用触发可读gets
的脚本尝试读取数据(read
或fileevent
)或进行检查,至少有一个字节存在。 (严格来说,实际上承诺的是读取单个字节的尝试不会阻塞,但可能是因为错误导致立即失败。这就是操作系统级文件描述符准备工作的语义。)
-buffering
选项仅影响输出通道;它在stdin
(或任何其他只读通道)上没用,并且完全没有效果。真。 (但是,移除它太麻烦了。)
答案 2 :(得分:0)
我知道这是一个老问题,但它引发了一些关于我的结果的研究,我发现了一个名为fileevent
的函数,它在流(即stdin)中有一些可以读取的内容时调用事件处理程序。这可能会有所帮助。