我知道如何在Ruby中运行shell命令,如:红宝石运行shell命令
%x[#{cmd}]
但是,我怎么指定一个目录来运行这个命令?
有脱壳而出的类似的方式,类似于在Python subprocess.Popen
:
subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local')
谢谢!
我知道如何在Ruby中运行shell命令,如:红宝石运行shell命令
%x[#{cmd}]
但是,我怎么指定一个目录来运行这个命令?
有脱壳而出的类似的方式,类似于在Python subprocess.Popen
:
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"
也许它不是最好的解决办法,但要尽量用Dir.pwd来获得当前目录并保存在某个地方。之后,使用Dir.chdir(destination),其中destination是您要从中运行命令的目录。运行该命令后,再次使用Dir.chdir,使用先前保存的目录将其恢复。
您也可以使用Dir.chdir的块版本。在块内部,您位于请求的目录中,在块之后,您仍然位于上一个目录中。 – knut 2012-04-13 20:48:30
@knut你应该做出答案 - 我喜欢它!我会建议一些像'Dir.chdir(Dir.pwd.tap {Dir.chdir('d:\ test \ local'); #otherstuff})'疯狂的东西,因为我不知道chdir可能会占用一个块 – 2012-04-13 20:53:32
@AbeVoelker你是对的,[这里是](http://stackoverflow.com/a/10148325/676874) – knut 2012-04-13 21:08:18
还,服用壳路线
%x[cd #{dir} && #{cmd}]
我有这个同样的问题,要解决它把两个命令的反引号,并用“& &”分隔:
`cd \desired\directory && command`
与安全改变DIR我看到backtricks最接近的是capture2
:
require 'open3'
output, status = Open3.capture2('pwd', :chdir=>"/tmp")
您可以在ruby文档中看到其他有用的Open3方法。一个缺点是对open3
的jruby
支持相当破碎。
+1似乎很少有Ruby程序员知道这件事。 – Phrogz 2012-04-13 21:10:35
像Ruby这样的事情块永远不会让我惊叹。 Ruby不断让我的其他语言感到笨重和过度复杂。 – bta 2012-04-13 21:23:31
这真是太神奇了,如果我早些知道这件事! – ZirconCode 2014-04-15 18:40:52