【发布时间】:2016-08-21 19:59:49
【问题描述】:
我试图在系统 $EDITOR 中打开一个 tmpfile,写入它,然后读入输出。我可以让它工作,但我想知道为什么调用 file.read 返回一个空字符串(当文件确实有内容时)
基本上我想知道文件写入后读取文件的正确方法。
require 'tempfile'
file = Tempfile.new("note")
system("$EDITOR #{file.path}")
file.rewind
puts file.read # this puts out an empty string "" .. why?
puts IO.read(file.path) # this puts out the contents of the file
是的,我将在一个确保块中运行它以核对使用过的文件;)
我在 ruby 2.2.2 上运行它并使用 vim。
【问题讨论】:
-
你用的是什么版本的ruby,你用什么编辑器来编辑内容。
-
我已经评论了 - 你认为它有什么不同?
-
如果你使用 vim 以外的东西会有所不同,因为对
system的调用会在编辑器本身之前退出。我的第一个猜测是您试图在编辑器写入任何字节之前读取文件。我想我已经找到了你的解决方法,请在下面查看我的答案。 -
嗯,我也针对 nano 和 emacs 测试了这个(在 OSX 上),它确实阻塞,直到文件被写入...当我在写入后退出程序 (vim/emacs/nano)文件,脚本显示我想要的结果。
-
是的,在标准设置中,大多数基于终端的文本编辑器(vim、nano、emacs)将接管整个终端会话,暂停脚本。作为独立应用程序的编辑器(sublime text、BBEdit、atom)将在当前终端会话之外启动,并且一旦启动应用程序,
system调用就会返回。