Ответ 1
Вы можете использовать блок-версию Dir.chdir
. Внутри блока вы находитесь в запрошенном каталоге, после того, как Блок все еще находится в предыдущем каталоге:
Dir.chdir('mydir'){
%x[#{cmd}]
}
Я знаю, как запустить команду оболочки в Ruby, например:
%x[#{cmd}]
Но как указать каталог для запуска этой команды?
Есть ли аналогичный способ обхода, аналогичный subprocess.Popen
в Python:
subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local')
Спасибо!
Вы можете использовать блок-версию Dir.chdir
. Внутри блока вы находитесь в запрошенном каталоге, после того, как Блок все еще находится в предыдущем каталоге:
Dir.chdir('mydir'){
%x[#{cmd}]
}
Ruby 1.9.3 (блокирующий вызов):
require 'open3'
Open3.popen3("pwd", :chdir=>"/") {|i,o,e,t|
p o.read.chomp #=> "/"
}
Dir.pwd #=> "/home/abe"
также, взяв маршрут оболочки
%x[cd #{dir} && #{cmd}]
Возможно, это не лучшее решение, но попробуйте использовать Dir.pwd, чтобы получить текущий каталог и сохранить его где-нибудь. После этого используйте Dir.chdir(destination), где destination - это каталог, из которого вы хотите запустить свою команду. После выполнения команды снова используйте Dir.chdir, используя ранее сохраненный каталог, чтобы восстановить его.
У меня была эта же проблема и она была решена, поставив обе команды в обратные тики и разделившись на "& &":
`cd \desired\directory && command`
Ближайшее, что я вижу к backtricks с безопасным изменяющимся директивом, capture2
:
require 'open3'
output, status = Open3.capture2('pwd', :chdir=>"/tmp")
В рубиновых документах вы можете увидеть другие полезные методы Open3. Один из недостатков заключается в том, что поддержка jruby
для open3
довольно нарушена.