Вопрос по shell, command, ruby – Ruby запускает команду оболочки в определенном каталоге

52

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

%x[#{cmd}]

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

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

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

Спасибо!

Ваш Ответ

6   ответов
4

Кроме того, принимая маршрут снаряда

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

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

Dir.chdir('mydir'){
  %x[#{cmd}]
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

что я вижу к бек-трюкам с безопасным изменением каталогаcapture2:

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

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

Error: User Rate Limit Exceeded:chdirError: User Rate Limit ExceededProcess.spawnError: User Rate Limit Exceededsystem, popen3Error: User Rate Limit Exceeded
1

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

Error: User Rate Limit Exceededhere it is
Error: User Rate Limit ExceededDir.chdirError: User Rate Limit Exceeded
Error: User Rate Limit ExceededDir.chdir(Dir.pwd.tap {Dir.chdir('d:\test\local'); #otherstuff})Error: User Rate Limit Exceeded
1

и я решил ее, поставив обе команды в обратном тике и отделившись с помощью & amp; & amp; & amp;

`cd \desired\directory && command`
12

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

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

Похожие вопросы