kuraga333
@kuraga333
Программист, аналитик

Почему при перенаправлении в файл вывод обрезан?

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 - не знаю...
  • Вопрос задан
  • 690 просмотров
Пригласить эксперта
Ответы на вопрос 4
BuriK666
@BuriK666
Компьютерный псих
Может у вас что-то идет в stderr?
> file 2>&1
Ответ написан
@hobo-mts
Shortly
В выводе случайно не затесался ^D, который означает конец файла?
Ответ написан
@ashumkin
системный разработчик
Направьте вывод вhexdump -C или sed -nel
Ещё попробуйте не puts, аp
Ответ написан
VladimirAndreev
@VladimirAndreev
php web dev
попробуйте >>file
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы