From: Kristof Bastiaensen Date: 2004-04-28T08:34:04+09:00 Subject: Re: popen issues On Tue, 27 Apr 2004 17:16:24 -0600, Ara.T.Howard wrote: >> Hi, >> >> It is maybe not a good idea to use /bin/bash as a pipe, because it is an >> interactive interpreter, and not made for pipe-communication. Normally you >> would just check for an end of file byte, but bash will not send you one. >> Is there any reason to use bash? > > really? mine does: > > ~ > ruby -e 'p IO.popen("bash -c exit").eof?' > true > > > how about you? > Indeed, if you call bash with an argument it does. But if you call just bash, like in the previous example, it doesn't. Instead of IO.popen("/bin/bash -c command"), you could better do just IO.popen("command"), (unless of course you want bash specific features). Kristof > -a > >> >> >> On Wed, 28 Apr 2004 06:06:30 +0900, Hal Fulton wrote: >> >> > Here's something I've never figured out. >> > >> > Suppose I want real two-way communication with a process via popen. >> > This seems doable. >> > >> > But apparently the read hangs until I do a close_write; and if I >> > do that, I can't write again. A flush doesn't work. >> > >> > Here's what I was thinking (simplified): >> > >> > io = IO.popen("/bin/bash","r+") do |f| >> > f.puts "ls" >> > puts f.readlines >> > f.puts "date" >> > puts f.readlines >> > end >> > >> > I even tried this (following) abomination, to no avail: >> > >> > io = IO.popen("/bin/bash","r+") do |f| >> > writer = f.dup >> > f.puts "ls\n" >> > f.close_write >> > puts f.readlines >> > w = writer.dup >> > w.puts "date\n" >> > w.close_write >> > puts f.readlines >> > end >> > >> > >> > Can someone advise? >> > >> > >> > Hal >> >>