在Ruby中修改另一个进程中打开的临时文件

时间:2018-04-03 00:32:07

标签: ruby

我正在尝试从Ruby脚本启动编辑器来编辑现有字符串,然后在编辑器退出时检索修改后的内容:

require 'tempfile'

STARTING_TEXT = <<~STR
Blah blah blah
blah balh blah
STR

Tempfile.create do |f|
  f.write(STARTING_TEXT)
  f.flush()
  f.rewind()
  system( "vim #{f.path}" )
  puts f.read
end

问题是,无论我在编辑器中放入临时文件中的内容,f.read始终只返回STARTING_TEXT。我知道我正在从编辑器中成功编写文件,因为如果我在使用断点进行system()调用后暂停执行,我可以cat临时文件并查看修改后的内容。

似乎某种缓冲(基于Ruby或基于操作系统)阻止我获取修改后的文本文件内容。发生了什么事?

2 个答案:

答案 0 :(得分:0)

我能够使用它:

Tempfile.create('.') do |f|
  f.write STARTING_TEXT
  f.flush
  system( "vim #{f.path}" )
  puts f.read
end

看起来f.rewind是你的问题。 ruby方法调用的BTW括号是可选的。如果你没有传递任何论据,肯定不需要。

我使用rvm ruby​​-2.4.1在MacOS 10.11.6中运行此命令,请参阅终端输出:

sandbox % ruby junk.rb
Blah blah bla
blah balh blah

These blahs ^^ where here already.
I typed this line in vim and then did :wq
sandbox %

也许试一下,看看是否所有内容都像您期望的那样:

require 'tempfile'

STARTING_TEXT = <<~STR
Blah blah blah
blah balh blah
STR

def puts_info(f)
  puts f.path
  puts f.stat.to_s
end

Tempfile.create do |f|
  f.write(STARTING_TEXT)
  puts_info(f)
  f.flush
  f.rewind
  system( "vim #{f.path}" )
  puts f.read
  puts_info(f)
end

答案 1 :(得分:0)

我认为在实际修改文件之后应该curl -k -X POST -F "myfile=@/hello.txt" https://11.11.1.3/ f.rewind之前。以下对我来说非常适合:

f.read

旁注:考虑在Tempfile.create(?.) do |f| f.write "Blah" f.flush system( "vim #{f.path}" ) # typing YAY f.rewind # ⇐ HERE! puts f.read end #⇒ Blah # YAY 硬编码之前尝试$EDITOR;用户的口味可能会有所不同:)