Изменение поведения get при чтении из командной строки в Ruby - PullRequest
3 голосов
/ 13 октября 2011

Предполагаемая операция с кодом Ruby ниже выглядит следующим образом:

  1. записать ARGV [0], файл с именем в командной строке, в старый
  2. создать новую временную копию этого файла
  3. цикл до ввода пользователем
  4. удалить временный файл

Когда я жестко кодирую 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}`

Я не понимаю, почему чтение из командной строки отличается от жесткого кодирования имени файла.

Я ценю любую помощь, которую вы можете оказать. Спасибо.

1 Ответ

3 голосов
/ 13 октября 2011

Проверьте документы :

Если Kernel.gets видит, что ARGV установлено, оно использует их в качестве имен файлов для кормить вместо чтения из stdin . Так что используйте expicit: $stdin.gets

...