Ruby脚本看不到它创建的文件的外部更改,具体取决于它的位置';快跑

Ruby脚本看不到它创建的文件的外部更改,具体取决于它的位置';快跑,ruby,file-io,Ruby,File Io,一位同事最近编写了一个Ruby脚本,它通过在外部文本编辑器中打开一个带有一些初始化文本的临时文件来提示用户输入,然后在编辑器关闭后对其执行操作。此行为类似于git处理提交/标记编辑的方式 require'tempfile' @命令=选项[:cmd]| |“vim” @file=Tempfile.new(“缓冲区”) @write(“这是文件中的初始文本”) 放置@file.read @pid=Kernel.spawn(“#{@command}#{@file.path}”) Process.wai

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

require'tempfile'
@命令=选项[:cmd]| |“vim”
@file=Tempfile.new(“缓冲区”)
@write(“这是文件中的初始文本”)
放置@file.read
@pid=Kernel.spawn(“#{@command}#{@file.path}”)
Process.wait(@pid)
@文件倒带
contents=@file.read
#用“内容”做东西
这个脚本对我的许多同事来说都很好,但当我运行它时,它不会接受我对临时文件所做的更改:它仍然将临时文件视为具有初始化文本。我追踪了这个问题,直到它是如何读取文件的
@file.rewind
不足以让它拾取更改。如果我不是通过file对象重新读取文件,而是根据
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中所做的工作很少,所以我可能遗漏了一些明显的东西

因此,我的问题是:

  • 造成差异的原因是什么?是否有记录在案?Ruby中是否有导致缓冲的变化?这是操作系统吗?是否在某个地方特别未指明是否会缓冲?虽然我可能找错了地方,但我没有在地图上看到任何明显的东西
  • 对于这一点,什么是可以跨操作系统版本工作的首选Ruby习惯用法?还是关闭和重新打开的方法是我的最佳选择

  • 这对我来说是一个与您类似的环境(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配置出错了

    我的测试:

  • 如果临时缓冲区被编辑为“嘿”(保存/退出),则
    放入内容
    显示嘿。我想这就是你想要的