Linux Mint. Скрипт на Ruby выводит некоторую информацию в stdout, стандартным puts. Но гарантировать, что там нет каких-либо хитрых символов - не могу.
Когда просто запускаю, то весь текст выводится в консоль. Когда делаю перенаправление в файл (
> file
), часть текста обрезается, в файле не весь текст, только часть (начальная).
Скрипт завершается удачно. В случае использования конвейера (
| wc
) то же самое - строк столько же, сколько и в file. Подхват stderr (
> file 2>&1
) не помогает.
В то же время, если писать в скрипте сразу в файл (
fputs
), то всё в порядке.
# process_direct.rb использует fputs
# process.rb использует puts
# других отличий нет
$ bundle exec ruby process_direct.rb && wc f_direct
3461 5858 87579 f_direct
$ bundle exec ruby process.rb
# визуально текст весь - конец этого вывода совпадает с концом предыдущего
$ bundle exec ruby process.rb > f_1 && wc f_1
3249 5531 82131 f_1
$ bundle exec ruby process.rb | wc
3249 5531 82131
$ bundle exec ruby process.rb > f_12 2>&1 && wc f_12
3249 5531 82131 f_12
Диск не переполнен. Пробовал как Bash, так и Sh.
Как такое вообще может быть? Спасибо.
P.S.: Исследование выявило следующий минимальный код, воспроизводящий проблему:
gem install happymapper
require 'happymapper'
class IpMetaData
include HappyMapper
end
resp = "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\n<ip-answer>\n<ip value=\"5.61.17\"><inetnum>4.16.0 - 5.255.255</inetnum><country>RU</country><city>\xCC\xEE\xF1\xEA\xE2\xE0</city><region>\xCC\xEE\xF1\xEA\xE2\xE0</region><district>\xD6\xE5\xED\xF2\xF0\xE0\xEB\xFC\xED\xFB\xE9 \xF4\xE5\xE4\xE5\xF0\xE0\xEB\xFC\xED\xFB\xE9 \xEE\xEA\xF0\xF3\xE3</district><lat>55.755787</lat><lng>37.617634</lng></ip>\n</ip-answer>"
IpMetaData.parse(resp)
puts "SUCCESS"
Что там в Happymapper - не знаю...