2012-04-13 137 views
44

我知道如何在Ruby中運行shell命令,如:紅寶石運行shell命令

%x[#{cmd}] 

但是,我怎麼指定一個目錄來運行這個命令?

有脫殼而出的類似的方式,類似於在Python subprocess.Popen

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

謝謝!

回答

109

您可以使用Dir.chdir的塊版本。你是在請求的目錄塊內,該塊之後你仍然在前面的目錄:

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

+1似乎很少有Ruby程序員知道這件事。 – Phrogz 2012-04-13 21:10:35

+5

像Ruby這樣的事情塊永遠不會讓我驚歎。 Ruby不斷讓我的其他語言感到笨重和過度複雜。 – bta 2012-04-13 21:23:31

+0

這真是太神奇了,如果我早些知道這件事! – ZirconCode 2014-04-15 18:40:52

10

的Ruby 1.9.3(阻塞調用):

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

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

也許它不是最好的解決辦法,但要儘量用Dir.pwd來獲得當前目錄並保存在某個地方。之後,使用Dir.chdir(destination),其中destination是您要從中運行命令的目錄。運行該命令後,再次使用Dir.chdir,使用先前保存的目錄將其恢復。

+2

您也可以使用Dir.chdir的塊版本。在塊內部,您位於請求的目錄中,在塊之後,您仍然位於上一個目錄中。 – knut 2012-04-13 20:48:30

+0

@knut你應該做出答案 - 我喜歡它!我會建議一些像'Dir.chdir(Dir.pwd.tap {Dir.chdir('d:\ test \ local'); #otherstuff})'瘋狂的東西,因爲我不知道chdir可能會佔用一個塊 – 2012-04-13 20:53:32

+0

@AbeVoelker你是對的,[這裏是](http://stackoverflow.com/a/10148325/676874) – knut 2012-04-13 21:08:18

4

還,服用殼路線

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

我有這個同樣的問題,要解決它把兩個命令的反引號,並用「& &」分隔:

`cd \desired\directory && command` 
1

與安全改變DIR我看到backtricks最接近的是capture2

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

您可以在ruby文檔中看到其他有用的Open3方法。一個缺點是對open3jruby支持相當破碎。