Stderr stdout redirection with Ruby?

i do have a shell script doing :

man "#{arg}" 2> "#{tmp}/#{fm}" PIPE man2html > "#{tmp}/#{f1}"

because i want to know if there is “No manual entry for “#{arg}””

then for the time being i’m using an tmp file “#{tmp}/#{fm}” which i
read after to know i i get the message :

“No manual entry for “#{arg}””

i’m sure there is a more elegant way doing that in Ruby, avoiding
shelling, BUT HOW TO ?

i’m sure there is a more elegant way doing that in Ruby, avoiding
shelling, BUT HOW TO ?

If you want to do it completely within Ruby, you could first slurp the
output of man into a Ruby variable, i.e.

man_page=%x(man #{arg})

and if it is OK, i.e.

if man_page.length > 0

send this as stdin into man2html, i.e. something like:

to_html=IO.popen(“man2html >#{f1}”,“w”)
to_html.print(man_page)
to_html.close

From a logical point of view, this solution has the advantage
that you don’t overwrite your file f1 if the man page does not exist.

For a simpler solution (a bit dirty, but less keystrokes), you might
consider
the following idea, which however does use a shell:

error_message=%x[(man #{arg}|man2html >#{f1}) 2>&1]

After this, error_message contains whatever man and/org man2html spilled
out onto stderr, but f1 is always overwritten (even if there is no man
page).

HTH,

Ronald

On Friday 10 August 2007 04:26:00 am Ronald F. wrote:

if man_page.length > 0
For a simpler solution (a bit dirty, but less keystrokes), you might

Ronald

By using ‘man_page=%x(man #{arg})’ you’re shelling out as well. It’s the
same as writing 'man_page = man #{arg}'. However, it’s probably good
to
do the checking / conversion stuff inside ruby and shell out multiple
times
rather than having actual program flow / code in sh scripting :D.

On 10 août, 13:26, “Ronald F.” [email protected] wrote:

if man_page.length > 0
For a simpler solution (a bit dirty, but less keystrokes), you might
consider
the following idea, which however does use a shell:

error_message=%x[(man #{arg}|man2html >#{f1}) 2>&1]

After this, error_message contains whatever man and/org man2html spilled
out onto stderr, but f1 is always overwritten (even if there is no man
page).

OK, fine thanks, in fact f1 is never overwritten the way i use it …

thanks a lot !

On Aug 10, 2007, at 3:30 AM, unbewust wrote:

i’m sure there is a more elegant way doing that in Ruby, avoiding
shelling, BUT HOW TO ?

require ‘rubygems’
require ‘open4’

stdin = ‘’, stdout = ‘’, stderr = ‘’

Open4.spawn cmd, :stdin=>stdin, :stdout=>stdout, :stderr=>stderr

there are many example in the dist and postings on this list.

a @ http://drawohara.com/

On 10 août, 23:02, “ara.t.howard” [email protected] wrote:

stdin = ‘’, stdout = ‘’, stderr = ‘’

Open4.spawn cmd, :stdin=>stdin, :stdout=>stdout, :stderr=>stderr

there are many example in the dist and postings on this list.

a @http://drawohara.com/

Fine ! thanks a lot !!!

On 10 août, 23:02, “ara.t.howard” [email protected] wrote:

stdin = ‘’, stdout = ‘’, stderr = ‘’

Open4.spawn cmd, :stdin=>stdin, :stdout=>stdout, :stderr=>stderr

i’ve tested allready, unfortunately i get a " undefined method spawn
for main object" after having included it…

Yvon

On 8/11/07, unbewust [email protected] wrote:

require ‘open4’

stdin = ‘’, stdout = ‘’, stderr = ‘’

Open4.spawn cmd, :stdin=>stdin, :stdout=>stdout, :stderr=>stderr

i’ve tested allready, unfortunately i get a " undefined method spawn
for main object" after having included it…

Did you do this?
include Open4

spawn cmd, …

Because that’s not going to work

spawn is a singleton method of the Open4 module.

Yvon