From: Jeremy Tregunna Date: 2006-08-26T06:53:00+09:00 Subject: Re: Can you temporarily turn off STDERR ?? On 06-08-25, at 15:30, bradjpeek wrote: > Inside a ruby script I want to: > > 1) redirect STDERR to /dev/null > 2) Issue a system call (e.g. system(tar xf tarfile file) ) > 3) revert to normal STDERR output > > I have a script that issues 3-4 system calls that are returning the > following message to STDERR: > > warning: Insecure world writable dir /opt, mode 040777 > > I'd like to suppress these messages (Let's assume that I can't change > the permissions on /opt). > > An example of one of the lines that is throwing the error is: > > x = `tar tf mytar.tar` # envoke the unix tar command > print x > > I can suppress the messages by: > > $stderr.reopen('/dev/null', 'w') # send STDERR to /dev/null > STDERR.puts "can you see me?" # message is suppressed > > But I haven't been able to figure out how to revert STDERR back to > before the the reopen. I only want to suppress this particular > message, but not others that may prove to be useful such as error > messages from the ruby interpreter. > > I've tried variations of: > > stderr = $stderr # save current STDERR IO instance > $stderr.reopen('/dev/null', 'w') # send STDERR to /dev/null > STDERR.puts "can you see me?" # message is suppressed > $stderr.reopen(stderr) # revert to default behavior > (doesn't > work) > STDERR.puts "what about me? # I want to see this but I don't > > Any suggestions? Modify that slightly: $stderr_backup = $stderr.dup $stderr.reopen("/dev/null", "w") STDERR.puts "should not see this" $stderr = $stderr_backup.dup STDERR = $stderr # can safely ignore the warning STDERR.puts "foo" # will print foo to the screen I make no guarantees that this is the best way to do it, infact I can safely say it's probably not. -- Jeremy Tregunna jtregunna@blurgle.ca