Search code examples
http-redirecttclio-redirectionteecisco-ios

Redirect stdout to a file in tcl


I know this has been asked before.

But hear me out once..

I'm working on a Cisco router (IOS).

I have to write a script which executes some commands and redirect their output to a file. But instead of using tee for every command, I want to open a file then run the commands , whose output will be redirected to the file and then close the file.

And even the redirection operator > is not working or the following answer:

How can I redirect stdout into a file in tcl


Solution

  • The fact that the solutions in that question aren't working for you is informative: the real issue that you are experiencing is that Tcl commands do not normally write to stdout anyway (except for puts, which has that as its main job, and parray, which is a procedure that uses puts internally). The “write to stdout” that you are used to is a feature of the interactive Tcl shell only.

    To capture the result of all commands while running a script, you need a wrapper like this:

    trace add execution source leavestep log_result
    proc log_result {cmd code result op} {
        puts stdout $result
    }
    source theRealScript.tcl
    

    You'll find that it produces a lot of output. Cutting the output down is a rather useful thing, so this reduces it to just the immediately-executed commands (rather than everything they call):

    trace add execution source enterstep log_enter
    trace add execution source leavestep log_result
    proc log_enter {args} {
        global log_depth
        incr log_depth
    }
    proc log_result {cmd code result op} {
        global log_depth
        if {[incr log_depth -1] < 1 && $result ne ""} {
            puts stdout $result
        }
    }
    source theRealScript.tcl
    

    You'll probably still get far more output than you want…