def popen3 program='task', *opts, &block
      execute = opts.unshift(program)
      execute = execute.join(" ")
      warn execute if DEBUG 

      Open3.popen3(execute) do |i, o, e, t|
        handle_response(o, e, t)
        yield(i, o, e, t) if block_given?
      end
    end
def popen3 program='task', *opts, &block
      execute = opts.unshift(program)
      execute = execute.join(" ")
      warn execute if DEBUG 

      Open3.popen3(execute) do |i, o, e, t|
        handle_response(o, e, t)
        yield(i, o, e, t) if block_given?
      end
    end
Use Open3#popen3 to execute a unix program with an array of options
 and an optional block to handle the response.

 @example
    Execute.popen3("task", "export") do |i, o, e, t|
      # Arbitrary code to handle the response...
    end

 @param program [String]
 @param opts [Array<String>] args to pass directly to the program
 @param block [Block] to execute after thread is successful
 @yield [i,o,e,t] STDIN, STDOUT, STDERR, and the thread to that block.
 @api public