Ruby在特定目录中运行shell命令

时间:2012-04-13 20:31:03

标签: ruby shell command

我知道如何在Ruby中运行shell命令,如:

%x[#{cmd}]

但是,如何指定运行此命令的目录?

是否有一种类似于shell的方式,类似于Python中的subprocess.Popen

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

谢谢!

6 个答案:

答案 0 :(得分:123)

您可以使用Dir.chdir的块版本。在块中,您位于请求的目录中,在阻止之后,您仍在上一个目录中:

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

答案 1 :(得分:12)

Ruby 1.9.3(阻止调用):

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

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

答案 2 :(得分:4)

另外,采取shell路线

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

答案 3 :(得分:2)

我最接近安全更改dir的backtricks是capture2

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

您可以在ruby文档中看到其他有用的Open3方法。一个缺点是jrubyopen3的支持相当破碎。

答案 4 :(得分:1)

也许这不是最好的解决方案,但尝试使用Dir.pwd来获取当前目录并将其保存在某处。之后使用Dir.chdir(destination),其中destination是您要从中运行命令的目录。运行该命令后再次使用Dir.chdir,使用以前保存的目录进行恢复。

答案 5 :(得分:1)

我遇到了同样的问题并通过将两个命令放在后面的刻度并用'&&'分隔来解决它:

`cd \desired\directory && command`