在 TCL 的 Open 命令中使用写访问
Using write access in Open command in TCL
在 TCL 的 open
命令中使用命令管道时如何使用写入 ('w') 和读取 ('r') 访问权限。
当我做类似的事情时:
set f1 [open "| ls -l" w]
它 returns 一个要写入的文件描述符,比如 file1
。
现在我很困惑如何使用这个文件描述符。
PS : 我的示例可能是错误的,在这种情况下,如果答案包含一个编程示例将是理想的,这样它会更清楚。
谢谢
一般来说,您可以对频道执行的主要操作是写入(使用 puts
)、读取(使用 gets
和 read
)以及 close
它。显然,只有可写才能写入,只有可读才能读取。
当您写入实现为管道的通道时,您将数据发送到管道另一端的程序;通常将其作为标准输入使用。并非所有程序都这样做; ls
是完全忽略其标准输入的之一。
但正如我上面所说,您可以做的另一件事是 close
频道。当您关闭管道时,Tcl 等待所有子进程终止(如果它们尚未终止)并且 收集它们的标准错误 输出,这成为来自 close
的错误消息如果有什么。 (这些错误就像您通过调用 exec
获得的错误一样;底层机制是共享的。)
在纯可写管道中 运行 ls
没有实际意义,至少除非您重定向其输出。它的全部目的是产生输出(排序的文件列表,以及 -l
选项的额外细节)。如果你想得到输出,你需要一个可读的通道(从 Tcl 的角度看是可读的):open "| ls -l" r
。然后你就可以使用 gets $f1
从子进程中读取一行。
但是因为 ls
完全是 non-interactive 并且几乎总是有一个非常快的 运行 时间(除非你的目录是 巨大的 或者你传递选项以启用递归),你也可以只使用 exec
。 这不适用于其他程序。 不一定;你需要了解发生了什么。
如果您想尝试管道,请尝试使用 sort -u
作为子流程。这需要输入并产生输出,并在此过程中表现出各种烦人的行为!理解如何使用它会告诉你很多关于程序自动化如何变得棘手,尽管它真的很简单。
在 TCL 的 open
命令中使用命令管道时如何使用写入 ('w') 和读取 ('r') 访问权限。
当我做类似的事情时:
set f1 [open "| ls -l" w]
它 returns 一个要写入的文件描述符,比如 file1
。
现在我很困惑如何使用这个文件描述符。
PS : 我的示例可能是错误的,在这种情况下,如果答案包含一个编程示例将是理想的,这样它会更清楚。
谢谢
一般来说,您可以对频道执行的主要操作是写入(使用 puts
)、读取(使用 gets
和 read
)以及 close
它。显然,只有可写才能写入,只有可读才能读取。
当您写入实现为管道的通道时,您将数据发送到管道另一端的程序;通常将其作为标准输入使用。并非所有程序都这样做; ls
是完全忽略其标准输入的之一。
但正如我上面所说,您可以做的另一件事是 close
频道。当您关闭管道时,Tcl 等待所有子进程终止(如果它们尚未终止)并且 收集它们的标准错误 输出,这成为来自 close
的错误消息如果有什么。 (这些错误就像您通过调用 exec
获得的错误一样;底层机制是共享的。)
在纯可写管道中 运行 ls
没有实际意义,至少除非您重定向其输出。它的全部目的是产生输出(排序的文件列表,以及 -l
选项的额外细节)。如果你想得到输出,你需要一个可读的通道(从 Tcl 的角度看是可读的):open "| ls -l" r
。然后你就可以使用 gets $f1
从子进程中读取一行。
但是因为 ls
完全是 non-interactive 并且几乎总是有一个非常快的 运行 时间(除非你的目录是 巨大的 或者你传递选项以启用递归),你也可以只使用 exec
。 这不适用于其他程序。 不一定;你需要了解发生了什么。
如果您想尝试管道,请尝试使用 sort -u
作为子流程。这需要输入并产生输出,并在此过程中表现出各种烦人的行为!理解如何使用它会告诉你很多关于程序自动化如何变得棘手,尽管它真的很简单。