LinuxForum.Fans
Тема

man bash

Автор: yars 11 сообщений 5415 просмотров
#261545

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

text
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), имеет ли это значение? Спасибо!

#261567

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

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

text

.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. Или речь о каких-то других символах кроме символов списка?

#261568

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

#261569

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

text

$ which nroff
/usr/bin/nroff

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

$ less $(which nroff)

#261574

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

#261576

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

text

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

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

text

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) или написать упрощённую замену.

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

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

text
GROFF_ENCODING=utf8 man что-то

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

#274027
"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 (о локалях он умеет заботиться самостоятельно). Но это лишняя зависимость, две стороны одной медали... Хотя, если прилинковать статически :)
#274029
"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.

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

#274031

"yars" написал:
Но работает же
... если все мануалы в utf8, локаль в utf8 и перекодировать не нужно. Но и мой рецепт выше в этом случае тоже работает.
А теперь слегка меняем условие: или мануал не в utf8, или пользователь сказал LANG=ru_RU.KOI8-R man ... (кстати, имеет полное право, может он по ssh зашёл и локаль его терминала как раз в KOI8-R).
#274032
bormant написал:
[quote="yars"]Но работает же
... если все мануалы в utf8, локаль в utf8 и перекодировать не нужно. Но и мой рецепт выше в этом случае тоже работает.
А теперь слегка меняем условие: или мануал не в utf8, или пользователь сказал LANG=ru_RU.KOI8-R man ... (кстати, имеет полное право, может он по ssh зашёл и локаль его терминала как раз в KOI8-R).[/quote]
Да, это я и не учел. Но локально-то вполне можно применить?
UPD:
"bormant" написал:
А теперь слегка меняем условие:

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

Войдите или зарегистрируйтесь, чтобы ответить.