[GRASS-dev] Merging stdout and stderr
Paul Kelly
paul-grass at stjohnspoint.co.uk
Mon Nov 13 17:14:20 EST 2006
The GRASS console thing (I guess that's where the name gronsole comes
from?) which runs commands via the Tcl/Tk "open" command and captures
their stdout and stderr, displaying some output as-is to the gronsole
window and catching certain things like percentage complete and warnings
and displaying them differently is actually quite cool.
I remember discussion on the list about how stdout and stderr had to be
merged because Tcl/Tk has a bug/feature in that it treats anything written
to stderr as an error indicator for the called program. On Unix this
merging is done as follows:
set cmd [concat | $cmd 2>@ stdout]
but the "2>@ stdout" syntax will not work on Windows. A cross-platform
solution would be to use the "|&" redirector instead of "2>@". "|&" means
"pipe both stdout and stderr to stdin of the following command" (see
http://www.tcl.tk/man/tcl8.5/tutorial/Tcl26.html ). This command could
then copy everything to its stdout and that's what gronsole gets back.
The Unix cat command is an obvious choice but it isn't available on
Windows. "more" kind of works but it's a shell (cmd.exe) built-in command
on Windows so not suitable either. I was wondering if anybody has any
thoughts on
1. Are there any other Windows commands that might be suitable for this?
or
2. Might it be a worthwhile idea to include a simple program with GRASS
that did this (copies everything from stdin to stdout) so we can be sure
what's going on?
I know I could get this working some hackish way but would like to do it
as elegantly as possible - so it would be great if we can come up with
something.
Paul
More information about the grass-dev
mailing list