В Ruby я хочу иметь возможность:
- запустить командную строку (через оболочку)
- перехватить как 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)