Bug 45581 - perldoc пишет текст в виде hex-дампа
Summary: perldoc пишет текст в виде hex-дампа
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: perl-Pod-Perldoc (show other bugs)
Version: unstable
Hardware: x86 Linux
: P5 normal
Assignee: viy
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-03-18 22:11 MSK by serpiph
Modified: 2023-03-31 14:33 MSK (History)
10 users (show)

See Also:


Attachments
самостоятельный вывод perldoc в консоль (32.91 KB, image/png)
2023-03-18 22:11 MSK, serpiph
no flags Details
Результат работы perldoc (22.75 KB, text/plain)
2023-03-27 09:17 MSK, serpiph
no flags Details
результат perldoc от viy (24.39 KB, text/plain)
2023-03-27 19:21 MSK, viy
no flags Details
Вывод perldoc с терминалом linux (22.75 KB, text/plain)
2023-03-31 09:35 MSK, serpiph
no flags Details
Вывод perldoc с терминалом xterm (22.75 KB, text/plain)
2023-03-31 09:38 MSK, serpiph
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description serpiph 2023-03-18 22:11:10 MSK
Created attachment 12761 [details]
самостоятельный вывод perldoc в консоль

Команда perldoc выдаёт текст в набора дампа при выводе текста на консоль (пример в аттаче). При перенаправлении в less выводит текст без проблем. Так и не нашёл, где это можно побороть.
Пример команды:
$ perldoc -f open
Comment 1 viy 2023-03-20 02:23:00 MSK
У меня на свежем сизифе не воспроизводится. Возможно, это зависит от терминала?

echo $TERM

что там?
Comment 2 serpiph 2023-03-20 09:17:28 MSK
$ echo $TERM
linux
$

Наблюдаю на эту проблему двух разных машинах. Дополнительно:

$ echo $LESS
-MM
$ echo $LESSKEY
/etc/.less
$ echo $LESSOPEN
'|/usr/share/less/lesspipe.sh %s'
$ cat /etc/.less
cat: /etc/.less: Нет такого файла или каталога
$
Comment 3 serpiph 2023-03-20 09:35:56 MSK
Изучая код lesspipe.sh и вывод strace, заметил, что этот скрипт почему-то считает вывод помощи Перл как "ELF " или как "data". Из-за этого выбирает hexdump для отображения на экране. Другой причины я не вижу, по которой бы из скрипта lesspipe.sh был бы вызван hexdump.
Comment 4 viy 2023-03-20 20:44:45 MSK
(Ответ для serpiph на комментарий #3)
> Изучая код lesspipe.sh и вывод strace, заметил, что этот скрипт почему-то
> считает вывод помощи Перл как "ELF " или как "data". Из-за этого выбирает
> hexdump для отображения на экране. Другой причины я не вижу, по которой бы
> из скрипта lesspipe.sh был бы вызван hexdump.

значит, это все из-за file. 
попробуйте не выходя из perldoc -f open
скопировать созданный временный файл из $TMP
сохраните и посмотрите, что на этот файл скажет file -bLz
Comment 5 serpiph 2023-03-27 09:15:35 MSK
$ file - bLz perl-open
data
$

Прикладываю файл, который получается от perldoc.
Comment 6 serpiph 2023-03-27 09:17:33 MSK
Created attachment 12809 [details]
Результат работы perldoc

Данный файл получается у perldoc, который потом выдаётся в hexdump с параметром -C.
Comment 7 serpiph 2023-03-27 09:20:48 MSK
(In reply to serpiph from comment #5)
> $ file - bLz perl-open
> data
> $
> 
> Прикладываю файл, который получается от perldoc.

Опечатка, правильно:

$ file -bLz perl_open
data
$
Comment 8 viy 2023-03-27 19:20:31 MSK
у меня c вашим файлом ситуация воспроизвелось и на p10.
less perl_open показывает как hexdump.

Остается вопрос, почему у вас получается именно такой файл?
Я приложу результат своего perldoc -f open
который показывается нормально.
diff показал, что у вас строки не wrapped, у меня wrapped.
Похоже на некорректную работу с терминалом.

Покажите, пожалуйста, что у вас

rpm -qa | grep perl | grep -i pod

rpm -qa | grep terminfo

И если нет terminfo-extra, что будет, если установить пакет terminfo-extra ?
Comment 9 viy 2023-03-27 19:21:39 MSK
Created attachment 12818 [details]
результат perldoc от viy
Comment 10 serpiph 2023-03-28 23:58:19 MSK
$ rpm -qa | grep perl | grep -i pod
perl-Pod-Usage-2.03-alt1.noarch
perl-pod-5.34.1-alt1.noarch
perl-Pod-Simple-3.43-alt1.noarch
perl-Pod-Escapes-1.07-alt1.noarch
perl-podlators-5.01-alt1.noarch
perl-Pod-Perldoc-3.20-alt1.noarch
perl-Pod-Parser-1.65-alt1.noarch
perl-Pod-Checker-1.75-alt1.noarch
$ rpm -qa | grep terminfo
terminfo-6.3.20220618-alt1.noarch
$ 
После установки terminfo-extra поведение perldoc не изменилось.
Comment 11 serpiph 2023-03-29 13:52:29 MSK
На второй машине:
$ rpm -qa | grep perl | grep -i pod
perl-Pod-Usage-2.03-alt1.noarch
perl-pod-5.34.1-alt1.noarch
perl-Pod-Simple-3.43-alt1.noarch
perl-Pod-Escapes-1.07-alt1.noarch
perl-podlators-5.01-alt1.noarch
perl-Pod-Perldoc-3.28-alt1.noarch
perl-Pod-Parser-1.65-alt1.noarch
perl-Pod-Checker-1.75-alt1.noarch
perl-Gtk2-Ex-PodViewer-0.18-alt2.noarch
perl-Pod-POM-2.01-alt1.noarch
perl-Pod-Strip-1.100-alt1.noarch
$ rpm -qa | grep terminfo
terminfo-6.3.20220618-alt1.noarch
$ 
После установки terminfo-extra на этой машине perldoc заработал нормально.
Comment 12 serpiph 2023-03-29 14:05:19 MSK
Даже интереснее становится. На второй машине в обычной текстовой консоли вызывается hexdump даже при установке terminfo, а в программе konsole в KDE команда perldoc показывает всё правильно даже без установки terminfo-extra.

В текстовой консоли
TERM=linux

В графической консоли
TERM=xterm-256color
Comment 13 viy 2023-03-29 18:39:14 MSK
посмотрите, что говорит в разных ситуациях 
echo $COLUMNS

и в проблемных ситуациях попробуйте запустить
perldoc с PERLDOCDEBUG=1

Такое ощущение, что в проблемных случаях либо $COLUMNS 
не выставляется корректно, тогда это связано с некорректной настройкой терминала,
вот похожие баги:
https://bugzilla.altlinux.org/show_bug.cgi?id=865
https://bugzilla.altlinux.org/show_bug.cgi?id=25245
https://bugzilla.altlinux.org/show_bug.cgi?id=35555

либо все же $COLUMNS корректно, но что-то другое ломает обертывание строк в Pod::Perldoc.
Comment 14 serpiph 2023-03-30 11:36:44 MSK
В графике COLUMNS=253, в текстовой консоли COLUMNS=128.

При указании PERLDOCDEBUG=1 перед командой диагностические сообщения одинаковы, последняя строка сообщает

'page: About to call Pod::Perldoc::ToTerm->pager_configuration("/usr/bin/less -isR")

Попробовал в текстовой консоли сделать

$ (unset LESSOPEN; perldoc -f open)

Команда отработала как в графике, без hexdump. То есть почему-то LESSOPEN отрабатывает в текстовой консоли и не отрабатывает в графике.
Comment 15 viy 2023-03-30 21:16:02 MSK
В общем, похоже, причиной подземный стук внутри file:
это видно на имеющемся у вас образце.

$ file perl_open*
perl_open:     data
perl_open_viy: ASCII English text, with escape sequences

file определил ваш выхлоп perldoc как (binary) data,
мой выхлоп file определил как ASCII English text,
при чем возможно file'у определить, что это ASCII English text,
помогли как раз escape sequences.

Соответственно, гипотеза:
у вас, когда вы на одной из машин установили terminfo-extra,
perldoc понял, что терминал поддерживает escape sequences
И ДОБАВИЛ их в свой выхлоп,
что помогло file'у определить, что это ASCII English text
и все заработало.

Попробуйте проанализировать выхлоп на второй машине:
если с terminfo-extra
file говорит ASCII English text, with escape sequences
а без terminfo-extra
file говорит data

то проблема именно в file, что он не может почему-то корректно определить ASCII English text без костыля в виде escape sequences.

Если это так, попробуйте собрать еще несколько различных образцов текстовых файлов, на которых проявляется глюк, и можно будет перевесить баг на виновника - file.
Comment 16 serpiph 2023-03-31 08:27:20 MSK
После всех проверок сделал всё более внимательно. Наличие или отсутствие terminfo-extra не влияет на поведение perldoc. perldoc отрабатывает нормально, если набрать

$ TERM=xterm perldoc -f open
$ TERM=xterm-256color perldoc -f open
$ (unset LESSOPEN; perldoc -f open)

Неважно, в текстовой или графической консоли это происходит, есть или нет terminfo-extra.

Если написать

$ TERM=linux perldoc -f open

То в любой консоли вне зависимости от наличи или отсутствия terminfo-extra будет hexdump.

Формирование текста выполняется ещё до запуска скрипта lesspipe.sh. Поэтому первый вопрос к модулю Perldoc, зачем он вообще форматирует текст по-разному, если потом идёт через lesspipe.sh. На каком этапе это случилось? На что влияет TERM? Где играет свою роль LESSOPEN? Нужен ли он? 

И уже последующий вопрос к file: что для него есть текст, а что бинарные данные?
Comment 17 serpiph 2023-03-31 09:35:23 MSK
Created attachment 12865 [details]
Вывод perldoc с терминалом linux

Результат вывода "TERM=linux perldoc -f open". В файле есть символы с кодом 0x0F.
Comment 18 serpiph 2023-03-31 09:38:38 MSK
Created attachment 12866 [details]
Вывод perldoc с терминалом xterm

Результат работы "TERM=xterm perldoc -f open". В тексте нет символа с кодом 0x0F. Определяется как ASCII.
Comment 19 viy 2023-03-31 13:57:27 MSK
(Ответ для serpiph на комментарий #18)
> Создано вложение 12866 [details] [подробности]
> Вывод perldoc с терминалом xterm
> 
> Результат работы "TERM=xterm perldoc -f open". В тексте нет символа с кодом
> 0x0F. Определяется как ASCII.

ESC это 0x1B, не 0x0F. У меня file пишет
perldoc_xterm: ASCII English text, with escape sequences.
Comment 20 serpiph 2023-03-31 14:33:29 MSK
(In reply to viy from comment #19)
> (Ответ для serpiph на комментарий #18)
> > Создано вложение 12866 [details] [подробности]
> > Вывод perldoc с терминалом xterm
> > 
> > Результат работы "TERM=xterm perldoc -f open". В тексте нет символа с кодом
> > 0x0F. Определяется как ASCII.
> 
> ESC это 0x1B, не 0x0F. У меня file пишет
> perldoc_xterm: ASCII English text, with escape sequences.

Сравните 2 файла, что я прислал, между собой. У них разница только в наличии или отсутствии символа с кодом 0x0F после ESC-команды. ESC-символы с кодом 0x1B есть в обоих файлах.

$ diff -Naur file1 file2 | less

Покажет дополнительный байт в виде "^O":

ESC[1m-iESC[m^O

вместо

ESC[1m-iESC[0m

с символом нуля перед последней m.