我知道如何在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