下面Ruby代码的预期操作如下:
- 写入ARGV[0],一个在命令行上命名的文件,到旧的
- 创建该文件的新临时副本
- 循环直到用户输入
- 删除临时文件
当我硬编码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