Подтвердить что ты не робот

Команда запуска Ruby run в определенном каталоге

Я знаю, как запустить команду оболочки в Ruby, например:

%x[#{cmd}]

Но как указать каталог для запуска этой команды?

Есть ли аналогичный способ обхода, аналогичный subprocess.Popen в Python:

subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local')

Спасибо!

4b9b3361

Ответ 1

Вы можете использовать блок-версию Dir.chdir. Внутри блока вы находитесь в запрошенном каталоге, после того, как Блок все еще находится в предыдущем каталоге:

Dir.chdir('mydir'){
  %x[#{cmd}]
}

Ответ 2

Ruby 1.9.3 (блокирующий вызов):

require 'open3'
Open3.popen3("pwd", :chdir=>"/") {|i,o,e,t|
  p o.read.chomp #=> "/"
}

Dir.pwd #=> "/home/abe"

Ответ 3

также, взяв маршрут оболочки

%x[cd #{dir} && #{cmd}]

Ответ 4

Возможно, это не лучшее решение, но попробуйте использовать Dir.pwd, чтобы получить текущий каталог и сохранить его где-нибудь. После этого используйте Dir.chdir(destination), где destination - это каталог, из которого вы хотите запустить свою команду. После выполнения команды снова используйте Dir.chdir, используя ранее сохраненный каталог, чтобы восстановить его.

Ответ 5

У меня была эта же проблема и она была решена, поставив обе команды в обратные тики и разделившись на "& &":

`cd \desired\directory && command`

Ответ 6

Ближайшее, что я вижу к backtricks с безопасным изменяющимся директивом, capture2:

require 'open3'
output, status = Open3.capture2('pwd', :chdir=>"/tmp")

В рубиновых документах вы можете увидеть другие полезные методы Open3. Один из недостатков заключается в том, что поддержка jruby для open3 довольно нарушена.