2014-01-25 111 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