Да, это специфично для 1.9. Похоже, что 1.8 использовал гораздо меньший и более ограниченный набор функций в Open3.

y я хочу иметь возможность:

запустить командную строку (через оболочку)захватывать как stdout, так и stderr (предпочтительно как один поток) без использования>2&1 (что не работает для некоторых команд здесь)запускать с дополнительными переменными окружения (без изменения среды самой программы ruby)

я узнал, чтоOpen3 позволяет мне делать 1 и 2.

              cmd = 'a_prog --arg ... --arg2 ...'
              Open3.popen3("#{cmd}") { |i,o,e|
                output = o.read()
                error = e.read()
                # FIXME: don't want to *separate out* stderr like this
                repr = "$ #{cmd}\n#{output}"
              }

Я также узнал, чтоPOPEN позволяет передать среду, ноне при указании командной строки.

Как мне написать код, который делает все три?

...

Иными словами, что такое Ruby-эквивалент следующего кода Python?

>>> import os, subprocess
>>> env = os.environ.copy()
>>> env['MYVAR'] = 'a_value'
>>> subprocess.check_output('ls -l /notexist', env=env, stderr=subprocess.STDOUT, shell=True)

Ответы на вопрос(1)

Ваш ответ на вопрос