On Fri, 25 Aug 2006 12:27:35 -0700, 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?

Tar is being run in a shell, so you could run:
system("tar xf mytar.tar 2>/dev/null")

You could also use the open3 library (from the standard library)
documented on p708 of Pickaxe or at
http://www.ruby-doc.org/stdlib/libdoc/open3/rdoc/index.html

--Ken

-- 
Ken Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu/~kbloom1/