Thanks for this - I have to admit that I cut down the real code quite
severely to make an example - and I didn't test the example, which was
a bit slack of me. I am glad that people saw the problem I was
alluding to though.

I have to admit that I don't like Guy's solution - when I have several
thousand files to process (honestly!) a 10 second delay per file (or
whatever) does make a difference. I know I can try and reduce the
sleep delay, but it just doesn't hit my elegance spot!

Dave, I do like your solution of running the output directly into
ruby. This will certainly work with this example, and I think I will
take it up; but in general it is still unsatisfactory in the case
where I need to recursively apply the script (Yep, following the
advice in PP (a fab book, thanks) I am using metadata files to control
post processing, and sometimes a recurse through several levels (eg
post process bar.txt -> foo.txt, then post process foo.txt...etc).

Anyway. Also, I'm afraid that on the system I am running ruby on
(HP-UX 10.4), whilst the backquotes process may have completely
finished and returned, all the disk writing certainly hasn't (although
the system I work with has most of the disk space mounted via NFS). So
I really do see problems where when I try reading back in the file, it
ends half way through a line.

I have just tried something along the following lines, and it appears
to work fine.


IO.popen("grep FOO foo.txt") do |pipe|
     pipe.each do |line|
       # ... process and put output into out_str
    end 
end

out_file=File.new("bar.txt","w+")
outfile.puts(out_str)
out_file.close

while File.stat("bar.txt").size!=out_str.size
   sleep 0.001
end
  

Anyway,
thank you both for your good advice and time...guess you guys have
acted as "code teddies" to a certain extent ;-)

Best regards

Steve 


Dave Thomas <Dave / PragmaticProgrammer.com> wrote in message news:<T1X47.9683$PF1.550370 / e420r-atl2.usenetserver.com>...
> stephen.hill / motorola.com (Steve Hill) writes:
> 
> > Some of the scripting relies on some of the standard unix tools to do
> > its work, called using backquotes. e.g. the following facet which
> > processes the columns of a file previously created with grep.
> 
> ..
> 
> > The problem is that the script may fail at the line marked A because
> > the file "foo.tmp" has either not been written at all, or has not been
> > completely written.
> 
> This shouldn't be a problem, because the command in backquotes will
> run to completion _before_ the rest of your code is executed.
> 
> However, there's a way to bypass this altogether: you can run the
> underlying command and have your Ruby program read the output
> directly, rather than having to write the output to a file and
> subsequently opening the file. Try:
> 
>  
>   IO.popen("grep FOO foo.txt") do |pipe|
>     pipe.each do |line|
>       # ...
>    end
>   end
> 
> A couple of other points. In your original code chunk, you had
> 'flag? = false'. Does that compile in your version of Ruby?
> You also had
> 
>    unless flag? do
>     ...
>    end
> 
> Although this looks reasonable, it isn't what you meant. The 'do'
> introduces a block (as in an iterator block), not the body of a
> compound statement. This will force 'flag?' to be interpreted as a
> method name.
> 
> 
> Dave