更改 Ruby 中从命令行读取 gets 的行为

3
下面的Ruby代码旨在执行以下操作:
  1. 将命令行上命名为ARGV[0]的文件写入old
  2. 创建该文件的新临时副本
  3. 循环直到用户输入
  4. 删除临时文件
当我将old硬编码为hello.c时,循环中的Timeout按照预期工作:它等待3秒钟以从键盘输入读取数据,如果没有输入则进入rescue块并重复执行。
当我将old设置为ARGV[0](也是hello.c)时,fp被赋值为hello.c的第一行,并且代码跳出了循环。
如何运行它:
user@cpu live$ ruby test.rb hello.c 
hello.c
#include <stdio.h>
user@cpu live$

代码如下:
#!/usr/bin/env ruby

require 'timeout'

old = ARGV[0].chomp
puts old  # sanity check
# old = 'hello.c'
new = 'tmp_' + old
`cp #{old} #{new}`

fp = nil
loop do
  begin
    Timeout::timeout(3) { fp = gets }
    puts fp  # sanity check
    break if (fp)
  rescue Timeout::Error
    # ...
  end
end

`rm #{new}`

我不明白为什么从命令行读取文件与硬编码文件名有何不同之处。
非常感谢您的帮助。谢谢。
1个回答

3

请查看文档

如果Kernel.gets发现ARGV已设置,它会将它们用作要读取的文件名,而不是从标准输入中读取。因此,请使用明确的方式:$stdin.gets


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接