[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Can you temporarily turn off STDERR ??

bradjpeek

8/25/2006 7:28:00 PM

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?

5 Answers

Ara.T.Howard

8/25/2006 7:46:00 PM

0

Ken Bloom

8/25/2006 7:49:00 PM

0

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/...

--Ken

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

bradjpeek

8/25/2006 7:54:00 PM

0


You, sir, are a scholar and a gentleman. Worked like a charm.

Ara.T.Howard

8/25/2006 7:55:00 PM

0

Jeremy Tregunna

8/25/2006 9:53:00 PM

0


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