2014-01-25 145 views
1

任何人都可以請解釋爲什麼下面的代碼段不起作用嗎?Can not cd in a ruby​​ script

@t=`mktemp -d` 
puts @t 
at_exit {system "rm -rf #{@t}"} 

begin 
    Dir.chdir @t 
rescue 
    puts $! 
    sleep 2 
    retry 
end 

cd基本上,甚至不反覆嘗試荷蘭國際集團到新創建的臨時目錄的工作,但在代碼是retry循環內,我可以非常清楚cd到它從一個不同的終端。 (at_exit部分工作 - 如果我打破retry循環與Ctrl-C,該目錄被刪除)。

我甚至嘗試在Dir.chdirFileUtils.cd之間切換,並運行幾個版本的ruby(> = 1.9.3)的腳本,都無濟於事。

+1

FWIW Ruby有[迪爾:: mktmpdir(HTTP目錄:// ruby-doc.org/stdlib-2.1.0/libdoc/tmpdir/rdoc/Dir.html#method-c-mktmpdir)。 – steenslag

+0

謝謝。這是有用的信息。我正在尋找它,但找不到它。 – PSkocik

+0

它看起來更乾淨,但我確實運行了一些基準測試,並且與外部命令相關的開銷與本機ruby函數看起來幾乎可以忽略不計,除非您正在運行巨大的循環。 – PSkocik

回答

2

你需要呼籲評估shell命令mktemp -d其他Dir.chdir格格將試圖改變目錄與新行字符

t = `mktemp -d` 
t #=> /tmp/tmp.4g680eJndT 
Dir.chdir t.chomp #Note that you need to strip the new line character that comes with the evaluated shell command 
Dir.pwd #=> /tmp/tmp.4g680eJndT 
+0

非常感謝,先生。只要我需要等待的2分鐘的時間結束,我會將你的答案標記爲我接受的答案。 ;-) – PSkocik