在Ruby中,当从命令行读取时,改变get的行为



下面Ruby代码的预期操作如下:

  1. 写入ARGV[0],一个在命令行上命名的文件,到旧的
  2. 创建该文件的新临时副本
  3. 循环直到用户输入
  4. 删除临时文件

当我硬编码old equal hello.c时,do循环中的Timeout就像我期望的那样工作:它等待键盘输入3秒,如果没有输入,则进入救援块并重复。

当我设置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}`

我不明白为什么从命令行读取和硬编码文件名有什么不同。

我很感激你能给予的任何帮助。谢谢。

查看文档:

如果Kernel.gets看到ARGV被设置,它使用它们作为文件名输入而不是从stdin读取。所以使用显式:$stdin.gets

相关内容

  • 没有找到相关文章

最新更新