如何将proc输出重定向到tcl中的文件,例如,我有一个proc foo,并希望将foo输出重定向到文件栏.但得到了这个结果
% proc foo {} { puts "hello world" }
% foo
hello world
% foo > bar
wrong # args: should be "foo"
Run Code Online (Sandbox Code Playgroud)
    如果您无法更改代码以获取要写入的通道的名称(最强大的解决方案),则可以使用技巧重定向stdout到文件:重新打开.
proc foo {} { puts "hello world" }
proc reopenStdout {file} {
    close stdout
    open $file w        ;# The standard channels are special
}
reopenStdout ./bar
foo
reopenStdout /dev/tty   ;# Default destination on Unix; Win equiv is CON:
Run Code Online (Sandbox Code Playgroud)
请注意,如果执行此操作,则会忽略初始stdout定向的位置(除非您使用TclX dup保存副本).
小智 5
这应该工作:
% proc foo {} { return "hello world" }
% foo
hello world
% exec echo [foo] > bar
% exec cat bar
hello world
% exec echo [foo] >> bar
% exec cat bar
hello world
hello world
% 
Run Code Online (Sandbox Code Playgroud)
        目前,当您输入foo > barTcl 时,它正在尝试运行一个带有 2 个参数的 foo 过程,因为该过程不存在,您会收到错误消息。我可以想到两种方法来解决这个问题。
您可以在顶层重定向,因此当您运行 tclsh 时tclsh > bar,所有输出都将被重定向,但我怀疑这就是您想要的。
您可以更改 foo 以便它接受打开的文件作为参数并写入:
proc foo {fp} {
   puts $fp "some text"
}
set fp [open bar w]
foo $fp
close $fp
Run Code Online (Sandbox Code Playgroud)