Предполагаемая операция с кодом Ruby ниже выглядит следующим образом:
- записать ARGV [0], файл с именем в командной строке, в старый
- создать новую временную копию этого файла
- цикл до ввода пользователем
- удалить временный файл
Когда я жестко кодирую old, равный hello.c, тайм-аут внутри цикла do работает так, как я и ожидал: он ждет ввода с клавиатуры в течение 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}`
Я не понимаю, почему чтение из командной строки отличается от жесткого кодирования имени файла.
Я ценю любую помощь, которую вы можете оказать. Спасибо.