Ruby脚本没有看到它创建的文件的外部更改,具体取决于它运行的位置

时间:2017-01-30 20:05:05

标签: ruby file-io

一位同事最近写了一个Ruby脚本,它通过在外部文本编辑器中打开带有一些初始化文本的临时文件来提示用户输入,然后在编辑器关闭后对其进行操作。此行为类似于git处理提交/标记编辑的方式。

require 'tempfile'

@command = options[:cmd] || "vim"
@file = Tempfile.new("buffer")
@file.write("This is the initial text in the file")
puts @file.read
@pid = Kernel.spawn("#{@command} #{@file.path}")
Process.wait(@pid)
@file.rewind
contents = @file.read
# Do stuff with "contents"

这个脚本对我的一些同事来说很好,但是当我运行它时,它不会接受我对临时文件所做的更改:它仍然将临时文件视为具有初始化文本。我将问题跟踪到如何阅读文件; @file.rewind不足以让它接受更改。我可以让它工作,如果不是通过文件对象重新读取文件,而是每File.new(@file.path)创建一个新文件。因此,我怀疑文件内容在运行时是缓冲的,但不是在它们运行时。

我在macOS 10.12.2上使用Ruby 2.4.0p0。这适用于在OS X 10.11.6上使用Ruby 2.0.0p643的同事,以及在Ubuntu上使用2.3.0-p0的另一位同事。当我使用Ruby 2.0.0p648时,我确认它在我的机器上不起作用,因此我怀疑这可能是由于操作系统的不同而不是Ruby差异。

请注意,我在Ruby中做的工作很少,所以我可能会遗漏一些明显的东西。

我的问题是:

  1. 造成这种差异的原因是什么,是否记录在某处? Ruby中是否有更改导致缓冲?这是OS的事吗?它是否特别在某处未指定是否会缓冲?我IO Ruby docs没有看到任何明显的东西,但我可能会找错地方。
  2. 什么是适用于此版本的首选Ruby习惯用法?或者是接近并重新开放的方法是我最好的拍摄?

1 个答案:

答案 0 :(得分:0)

这对我来说和你一样(mac / ruby​​ 2.4.x)。这里是内容在临时缓冲区中更改的完整脚本。

require 'tempfile'

options = {}
@command = options[:cmd] || "nano"
@file = Tempfile.new("buffer")
@file.write("This is the initial text in the file")
puts @file.read
@pid = Kernel.spawn("#{@command} #{@file.path}")
Process.wait(@pid)
@file.rewind
contents = @file.read

puts contents

我将其更改为nano,但vim也有效。也许你的vim配置是干扰?

我的测试:

  1. 如果编辑临时缓冲区以说"嘿" (保存/退出)然后puts contents说嘿。我想这就是你想要的。