1

Доброго времени! Вот такая проблема: если пересобрать man согласно рецепту bormant'a,  то у меня получается следующее:

RESTRICTED SHELL
       If bash is started with the name rbash, or the -r option is supplied at invocation,  the  shell  becomes  restricted.   A
       restricted  shell  is  used  to set up an environment more controlled than the standard shell.  It behaves identically to
       bash with the exception that the following are disallowed or not performed:

             changing directories with cd

             setting or unsetting the values of SHELL, PATH, ENV, or BASH_ENV

             specifying command names containing /

             specifying a file name containing a / as an argument to the .  builtin command

             specifying a filename containing a slash as an argument to the -p option to the hash builtin command

             importing function definitions from the shell environment at startup

             parsing the value of SHELLOPTS from the shell environment at startup

             redirecting output using the >, >|, <>, >&, &>, and >> redirection operators

             using the exec builtin command to replace the shell with another command

             adding or deleting builtin commands with the -f and -d options to the enable builtin command

             using the enable builtin command to enable disabled shell builtins

             specifying the -p option to the command builtin command

             turning off restricted mode with set +r or set +o restricted.

       These restrictions are enforced after any startup files are read.

       When a command that is found to be a shell script is executed (see COMMAND EXECUTION above), rbash turns off any restric-
       tions in the shell spawned to execute the script.

Как видите, несколько символов "оно" посчитало недопустимыми и удалило. Как бы это побороть? Я собирал версию из 12.1 (1.6f), имеет ли это значение? Спасибо!

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

2 (28.06.2012 10:45:02 отредактировано bormant)

Корень проблемы в том, что nroff (groff), используемый для форматирования страниц man, не умеет utf-8 как следует.
Поэтому, самым правильным решением является добавление соответствующей поддержки в nroff (groff).
Поскольку этого никто пока не сделал, приходится выполнять "приседания" по "кормёжке" nroff текстами в однобайтной кодировке. Если в этой кодировке отсутствует какой-то символ (например "№" в KOI8-R), то он потеряется. Это что касается самого текста страницы.

Что использовать в качестве символов списка -- тут нужно смотреть в сторону настроек nroff (groff). В исходнике страницы на месте списка:

.SH "RESTRICTED SHELL"
.\" rbash.1
.zY
.PP
If
.B bash
is started with the name
.BR rbash ,
or the
.B \-r
option is supplied at invocation,
the shell becomes restricted.
A restricted shell is used to
set up an environment more controlled than the standard shell.
It behaves identically to
.B bash
with the exception that the following are disallowed or not performed:
.IP \(bu
changing directories with \fBcd\fP
.IP \(bu
setting or unsetting the values of
.SM
.BR SHELL ,
.SM
.BR PATH ,
.SM
.BR ENV ,
or
.SM
.B BASH_ENV
.IP \(bu
specifying command names containing
.B /

и т.д. Символы ненумерованного списка -- это команда ".IP \(bu" в исходнике страницы. В том виде, как оно есть, это символ с кодом \xB7. Если в качестве однобайтной будет использована кодировка, в которой \xB7 является символом ненумерованного списка (bullet), он будет успешно преобразован в него же, но в UTF-8.
Другой путь -- поискать в настройках nroff (groff) как заставить его выдавать вместо этого символа другой, например, дефис (минус).

ps. Или речь о каких-то других символах кроме символов списка?

3

Ну да, спасибо, речь именно о символах списка (в данном случае). Но главное, я теперь знаю где смотреть, если что, и по мере того, как буду замечать подобные нестыковки, буду об этом рапортовать. Жаль, меня пока не хватает на что-то более серьезное, чем лазить по конфигам ac

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

4

То, как вызывается groff из nroff -- отдельная песня. Намекаю:

$ which nroff
/usr/bin/nroff

$ file $(which nroff)
/usr/bin/nroff: POSIX shell script, ASCII text executable

$ less $(which nroff)

5

Ага. Спасибо еще раз, намек понял, буду разбираться.

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

6 (28.06.2012 12:03:24 отредактировано bormant)

Если допустить, что все русские страницы перекодированы в utf8, консоль в utf8, то можно использовать строчку NROFF:

NROFF           /usr/bin/groff -mandoc -Dutf8 -Tutf8

А если добавить enca для перекодирования входного "чего угодно" в utf8, может неплохо получиться ;-) Что-то вроде

NROFF           /usr/bin/enconv -L ru -x utf8 | /usr/bin/groff -mandoc -Dutf8 -Tutf8

ps. Плата -- потеря универсальности, "LANG=ru_RU.KOI8-R man нечто" использовать уже не получится, ибо utf8 в этом варианте "прибита гвоздиком".
pps. Но можно попробовать поправить nroff под свои нужды (добавив -Dutf8 для случая -Tutf8) или написать упрощённую замену.

7 (07.09.2012 15:33:39 отредактировано yars)

bormant пишет:

Корень проблемы в том, что nroff (groff), используемый для форматирования страниц man, не умеет utf-8 как следует.

В 14.0, похоже, это уйдет в прошлое ab
Как и пишут на LQ, запуск

GROFF_ENCODING=utf8 man что-то

решает проблему перекодировки манов, а вот сообщения самой программы пока приходится побеждать по старинке ab

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

8 (07.09.2012 19:22:54 отредактировано bormant)

yars пишет:

решает проблему перекодировки манов

Увы и ах, но

there is no magic solution, as the manuals are bundled without any mechanism allowing to each of them to declare the charset it uses.


yars пишет:

а вот сообщения самой программы пока приходится побеждать по старинке

Это решается намного проще, если дописать маленький патчик с использованием gettext (о локалях он умеет заботиться самостоятельно). Но это лишняя зависимость, две стороны одной медали... Хотя, если прилинковать статически ab

9

bormant пишет:

there is no magic solution, as the manuals are bundled without any mechanism allowing to each of them to declare the charset it uses.

Блииин. Не заметил на радостях, там шрифт мелкий довольно. Но работает же. ac

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

10

yars пишет:

Но работает же

... если все мануалы в utf8, локаль в utf8 и перекодировать не нужно. Но и мой рецепт выше в этом случае тоже работает.
А теперь слегка меняем условие: или мануал не в utf8, или пользователь сказал LANG=ru_RU.KOI8-R man ... (кстати, имеет полное право, может он по ssh зашёл и локаль его терминала как раз в KOI8-R).

11 (07.09.2012 22:25:16 отредактировано yars)

bormant пишет:
yars пишет:

Но работает же

... если все мануалы в utf8, локаль в utf8 и перекодировать не нужно. Но и мой рецепт выше в этом случае тоже работает.
А теперь слегка меняем условие: или мануал не в utf8, или пользователь сказал LANG=ru_RU.KOI8-R man ... (кстати, имеет полное право, может он по ssh зашёл и локаль его терминала как раз в KOI8-R).

Да, это я и не учел. Но локально-то вполне можно применить?
UPD:

bormant пишет:

А теперь слегка меняем условие:

А вот ваше решение как раз будет давать корректный результат в этом случае, да.
Так что, придется ждать и параллельно изучать Си ac

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580