【发布时间】:2012-04-26 05:39:24
【问题描述】:
我知道如何在 Ruby 中运行 shell 命令,例如:
%x[#{cmd}]
但是,我该如何指定一个目录来运行这个命令呢?
有没有类似的脱壳方式,类似于Python中的subprocess.Popen:
subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local')
谢谢!
【问题讨论】:
我知道如何在 Ruby 中运行 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"
【讨论】:
还有,走shell路线
%x[cd #{dir} && #{cmd}]
【讨论】:
我看到的最接近安全更改目录的回招是capture2:
require 'open3'
output, status = Open3.capture2('pwd', :chdir=>"/tmp")
您可以在 ruby 文档中查看其他有用的 Open3 方法。一个缺点是jruby 对open3 的支持相当不完善。
【讨论】:
Process.spawn 的调用(system、popen3、...)的:chdir 选项似乎对于启动并行进程也是线程安全的。跨度>
也许这不是最好的解决方案,但尝试使用 Dir.pwd 获取当前目录并将其保存在某处。之后使用 Dir.chdir(destination),其中destination 是您要从中运行命令的目录。运行命令后再次使用 Dir.chdir,使用之前保存的目录来恢复它。
【讨论】:
Dir.chdir的块版本。在块内,您位于请求的目录中,在块之后您仍在上一个目录中。
Dir.chdir(Dir.pwd.tap {Dir.chdir('d:\test\local'); #otherstuff}) 这样疯狂的东西,因为我不知道 chdir 可能会占用一个块
我遇到了同样的问题,并通过将两个命令放在反引号中并用'&&'分隔来解决它:
`cd \desired\directory && command`
【讨论】: