Open4 stdin.close required?

Hi,

This is probably a stupid question, but I'm using open4 and I am
wondering if I'm using it 'correctly'. Anyway the following is from the
examples for open 4. Notice that in this case a stdin.close call is made
which makes sense to me in this case:

    require "open4"

    pid, stdin, stdout, stderr = Open4::popen4 "sh"

    stdin.puts "echo 42.out"
    stdin.puts "echo 42.err 1>&2"
    stdin.close

    ignored, status = Process::waitpid2 pid

    puts "pid : #{ pid }"
    puts "stdout : #{ stdout.read.strip }"
    puts "stderr : #{ stderr.read.strip }"
    puts "status : #{ status.inspect }"
    puts "exitstatus : #{ status.exitstatus }"

But what if I'm invoking a command like this:

  require "open4"

    pid, stdin, stdout, stderr = Open4::popen4 "cd /some/random/dir &&
run_a_script"
    stdin.close

    ignored, status = Process::waitpid2 pid

    puts "pid : #{ pid }"
    puts "stdout : #{ stdout.read.strip }"
    puts "stderr : #{ stderr.read.strip }"
    puts "status : #{ status.inspect }"
    puts "exitstatus : #{ status.exitstatus }"

Do I still need the stdin.close? Also, is it advisable to always open a
separate shell and invoke the command from stdin? Something like:

require "open4"

    pid, stdin, stdout, stderr = Open4::popen4 "sh"
    stdin.puts "cd /some/random/dir && run_a_script"
    stdin.close

    ignored, status = Process::waitpid2 pid

    puts "pid : #{ pid }"
    puts "stdout : #{ stdout.read.strip }"
    puts "stderr : #{ stderr.read.strip }"
    puts "status : #{ status.inspect }"
    puts "exitstatus : #{ status.exitstatus }"

Thanks.

···

--
Posted via http://www.ruby-forum.com/.