在 TCL 的 Open 命令中使用写访问

Using write access in Open command in TCL

在 TCL 的 open 命令中使用命令管道时如何使用写入 ('w') 和读取 ('r') 访问权限。

当我做类似的事情时:

set f1 [open "| ls -l" w]

它 returns 一个要写入的文件描述符,比如 file1

现在我很困惑如何使用这个文件描述符。

PS : 我的示例可能是错误的,在这种情况下,如果答案包含一个编程示例将是理想的,这样它会更清楚。

谢谢

一般来说,您可以对频道执行的主要操作是写入(使用 puts)、读取(使用 getsread)以及 close它。显然,只有可写才能写入,只有可读才能读取。

当您写入实现为管道的通道时,您将数据发送到管道另一端的程序;通常将其作为标准输入使用。并非所有程序都这样做; ls 是完全忽略其标准输入的之一。

但正如我上面所说,您可以做的另一件事是 close 频道。当您关闭管道时,Tcl 等待所有子进程终止(如果它们尚未终止)并且 收集它们的标准错误 输出,这成为来自 close 的错误消息如果有什么。 (这些错误就像您通过调用 exec 获得的错误一样;底层机制是共享的。)

在纯可写管道中 运行 ls 没有实际意义,至少除非您重定向其输出。它的全部目的是产生输出(排序的文件列表,以及 -l 选项的额外细节)。如果你想得到输出,你需要一个可读的通道(从 Tcl 的角度看是可读的):open "| ls -l" r。然后你就可以使用 gets $f1 从子进程中读取一行。

但是因为 ls 完全是 non-interactive 并且几乎总是有一个非常快的 运行 时间(除非你的目录是 巨大的 或者你传递选项以启用递归),你也可以只使用 exec这不适用于其他程序。 不一定;你需要了解发生了什么。


如果您想尝试管道,请尝试使用 sort -u 作为子流程。这需要输入并产生输出,并在此过程中表现出各种烦人的行为!理解如何使用它会告诉你很多关于程序自动化如何变得棘手,尽管它真的很简单。