通过创建到ls的管道,这个tcl脚本实现了什么?

通过创建到ls的管道,这个tcl脚本实现了什么?,tcl,Tcl,以下是脚本: # Announce intent puts "\nOpening a Pipe\n" # and open a pipe to the ls command set pipe [open "|ls /" "r"] # Equivalent command under MS-Windows is: # set pipe [open "!command.com /c dir" "r"

以下是脚本:

# Announce intent
puts "\nOpening a Pipe\n"

# and open a pipe to the ls command
set pipe [open "|ls /" "r"]

# Equivalent command under MS-Windows is:
# set pipe [open "!command.com /c dir" "r"]
# read the output of the ls command:

while {![eof $pipe]} {
  set length [gets $pipe lsLine]
  puts "$lsLine is $length characters long"
}
我不明白这是什么管道的ls?ls不是一个文件,所以我不明白这里发生了什么

返回的数据如下所示:

bin is 3 characters long
cygdrive is 8 characters long
Cygwin.bat is 10 characters long
Cygwin.ico is 10 characters long
Cygwin-Terminal.ico is 19 characters long
dev is 3 characters long
etc is 3 characters long
home is 4 characters long
lib is 3 characters long
proc is 4 characters long
sbin is 4 characters long
tmp is 3 characters long
usr is 3 characters long
var is 3 characters long
 is -1 characters long
这是一个只读管道——请注意(可选)
“r”
,它不是一个进入管道,而是一个流出管道。它所做的是创建一个Tcl通道,可以从中读取
ls/
的输出。事实上,它与exec ls/做的事情相同,只是它将结果包装为通道,而不是全部读取并生成字符串。前面的
|
中只有一个特殊的指示符,表示“生成管道”。(您对Windows的评论有点错误;
没有特殊意义,
|
在该平台上有其通常的特殊意义。)

请注意,Tcl处理管道相当好,因为在所有平台上,您都可以使用它们进行异步I/O(包括将它们与通知程序一起使用,
fileevent
)背后的机制),这一点在双向管道中尤其明显(双向管道确实有一堆陷阱,但它们实际上不是Tcl的错)。但是,在阻塞模式下,您有一个简单的只读案例,并且正在阅读整行内容


当输出相当小并且您只是读取所有内容时,使用
exec…
而不是
open |…
肯定会更容易一些

此外,如果您只想列出目录的内容,请使用Tcl内置的
glob
命令。

这是一个只读管道-请注意(可选)
“r”
,它不是一个管道,而是一个管道。它所做的是创建一个Tcl通道,可以从中读取
ls/
的输出。事实上,它与exec ls/做的事情相同,只是它将结果包装为通道,而不是全部读取并生成字符串。前面的
|
中只有一个特殊的指示符,表示“生成管道”。(您对Windows的评论有点错误;
没有特殊意义,
|
在该平台上有其通常的特殊意义。)

请注意,Tcl处理管道相当好,因为在所有平台上,您都可以使用它们进行异步I/O(包括将它们与通知程序一起使用,
fileevent
)背后的机制),这一点在双向管道中尤其明显(双向管道确实有一堆陷阱,但它们实际上不是Tcl的错)。但是,在阻塞模式下,您有一个简单的只读案例,并且正在阅读整行内容


当输出相当小并且您只是读取所有内容时,使用
exec…
而不是
open |…
肯定会更容易一些


此外,如果您只想列出目录的内容,请使用Tcl内置的
glob
命令。

-1
获取$channel varName
的“无法读取任何内容”指示符,在阻塞通道上,这只意味着文件结束。请参阅,这是tcl内置的
glob
命令的更好替代方法。另外,您之前没有问过当{[gets stdinline]>=0}{}时,
中的比较点吗?您的最后一行输出就是您看到它被使用的原因。
-1
是从
获取$channel varName
的“无法读取任何内容”指示符,它在阻塞通道上仅表示文件结束。请参阅,这是tcl内置的
glob
命令的更好替代方法。此外,在{[gets stdin line]>=0}{}
时,您刚才没有问过关于比较点的问题吗?您的最后一行输出就是您看到它被使用的原因。