i'm not sure why, but modifying the constants STDOUT and STDERR seems to give the 'expected' behavior both with the calling process and withing sub-processes (backquoted sub-shell expressions). i tried all manner of delegation, inheritance, extension - but the following is simple and works like it reads : =============================================================================== #!/usr/bin/env ruby # save everything for restoration IN = STDIN.clone ERR = STDERR.clone OUT = STDOUT.clone # the log file $log = open 'logfile', 'w' # redirect STDOUT to logfile STDOUT.reopen $log # merge STDERR and STDOUT STDERR.reopen STDOUT # output goes to logfile `ls non_existent_file` # output goes to logfile $stderr.puts 'foo' # output goes to logfile $stdout.puts 'bar' # output goes to logfile puts 'end test 0' # unmerge STDERR STDERR.reopen ERR # output goes to stderr `ls non_existent_file` # output goes to stderr $stderr.puts 'foo' # STDOUT still points to logfile... # output goes to logfile $stdout.puts 'bar' # output goes to logfile puts 'end test 1' =============================================================================== i am still very confused as to why asigning to $stdout is so much different that modifying STDOUT - especially when concerning sub-processes... -ara