60

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

%x[#{cmd}]

但是,我如何指定一个目录来运行这个命令?

是否有类似的脱壳方式,类似于subprocess.PopenPython:

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

谢谢!

4

6 回答 6

141

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

Dir.chdir('mydir'){
  %x[#{cmd}]
}
于 2012-04-13T21:07:09.483 回答
12

Ruby 1.9.3(阻塞调用):

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

Dir.pwd #=> "/home/abe"
于 2012-04-13T20:45:45.513 回答
4

还有,走shell路线

%x[cd #{dir} && #{cmd}]
于 2012-04-14T10:53:24.957 回答
4

我看到的最接近安全更改目录的回招是capture2

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

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

于 2014-08-26T08:10:08.217 回答
1

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

于 2012-04-13T20:46:17.260 回答
1

我遇到了同样的问题,并通过将两个命令放在反引号中并用'&&'分隔来解决它:

`cd \desired\directory && command`
于 2013-12-03T17:21:43.060 回答