如何将stdout重定向到tcl中的文件

Yik*_*ang 10 tcl

如何将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)

Don*_*ows 5

如果您无法更改代码以获取要写入的通道的名称(最强大的解决方案),则可以使用技巧重定向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)


Jac*_*son 1

目前,当您输入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)