Can you temporarily turn off STDERR ??

B

bradjpeek

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?
 
A

ara.t.howard

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

the warning is from ruby.

$VERBOSE = nil

will shut it up

if you want it shut up only sometimes do

def quiet
v = $VERBOSE
yield
ensure
$VERBOSE = v
end

then

x = quietly{ `tar tf mytar.tar` }
print x
Any suggestions?

if you really want fine control over stdin/stdout/stderr of executed commands
check out my session and open4 libs

http://codeforpeople.com/lib/ruby/session/session-2.4.0/README
http://codeforpeople.com/lib/ruby/open4/open4-0.5.1/README

in particular the Open4::spawn command. both are available as

gem install session
gem install open4

regards.

-a
 
K

Ken Bloom

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
 
A

ara.t.howard

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

it's ruby that prints the message, not the command

jib:~/shared > ruby -e' system "true" '
-e:1: warning: Insecure world writable dir /dmsp/moby-1-1/ahoward/shared/.,
mode 040777

fyi.

cheers.


-a
 
J

Jeremy Tregunna

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,816
Latest member
SapanaCarpetStudio

Latest Threads

Top