tcltclsh

In a tcl script how can i use puts to write a string to the console and to a file at the same time?


# Prints the string in a file
puts $chan stderr "$timestamp - Running test: $test"

# Prints the string on a console
puts "$timestamp - Running test: $test"

Is there a way I can send the output of puts to the screen and to a log file at the same time? Currently I have both the above two lines one after the other in my script to achieve this.

Or is there any other solution in tcl ?


Solution

  • Use the following proc instead of puts:

    proc multiputs {args} {
        if { [llength $args] == 0 } {
            error "Usage: multiputs ?channel ...? string"
        } elseif { [llength $args] == 1 } {
            set channels stdout
        } else {
            set channels [lrange $args 0 end-1]
        }
        set str [lindex $args end]
        foreach ch $channels {
            puts $ch $str
        }
    }
    

    Examples:

    # print on stdout only
    multiputs "1"
    
    # print on stderr only
    multiputs stderr "2"
    
    set brieflog [open brief.log w]
    set fulllog [open detailed.log w]
    # print on stdout and in the log files
    multiputs stdout $brieflog $fulllog "3"