Запустите командную строку с пользовательской средой - PullRequest
14 голосов
/ 07 мая 2011

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

  1. запустить командную строку (через оболочку)
  2. перехватить как stdout, так и stderr (предпочтительно в виде одного потока) без использования >2&1 (что не работает для некоторых команд здесь)
  3. запуск с дополнительными переменными окружения (без изменения среды самой программы 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 Ответ

15 голосов
/ 07 мая 2011

Open.popen3 дополнительно принимает хеш в качестве первого аргумента (в этом случае ваша команда будет вторым аргументом:

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

Open использует Process.spawn для запуска команды, поэтому вы можетепосмотрите документацию для Process.spawn , чтобы увидеть все его опции.

...