Настройка и работа в Linux
adb5321d

Вот из ит? man, apropos, whatis


В данном параграфе рассмотрим те способы, с помощью которых можно получить информацию по интересующему нас вопросу.

Для наглядности я поставлю перед собой вопрос, и попытаюсь показать как можно на него ответить, используя рассматриваемые команды. Иногда для того чтобы более широко раскрыть тему, и продемонстрировать парочку дополнительных приемов, я сознательно не буду замечать решения, которое лежит на поверхности:

Итак, как говорил Ворошилов, вопрос господа: Что же такое регулярные выражения и с чем их едят? - вопрос отнюдь не праздный и очень важный, поэтому попытаемся найти всю или почти всю информацию касающуюся данной темы. На иностранном языке эти самые выражения называются regular expression, возьмем для зацепки первое слово, regular - это и будет наша отправная точка.

Для начала попробуем узнать что поэтому поводу говорит man:

$ man regular No manual entry for regular

Увы, факир был пьян и так далее. Чем плох man без параметров, он слишком прямолинеен, и выведет вам страницу руководства, только в случае полного соответствия команды в запросе и команды в заголовке страницы. Но у man, есть полезный ключ -k, или символическая ссылка под именем apropos, с помощью которой ищется вхождение заданного в качестве параметра слова в заголовок страницы руководства. Итак набираем:

$ apropos regular Tcl_RegExpCompile (3) - Pattern matching with regular expressions Tcl_RegExpCompile [RegExp] (3) - Pattern matching with regular expressions

........... skipped .........

zgrep (1) - search possibly compressed files for a regular expression re (3) - Perl pragma to alter regular expression behaviour

Получаем изрядную порцию информации, в которой большая часть описывает, функции некого Tcl, который нам сейчас ни к селу ни к городу, поэтому попробуем отсеять из вывода apropos-а, ненужную информацию, делается это так:

$ apropos regular | grep -v Tcl_ pbmmask (1) - create a mask bitmap from a regular bitmap perlre (1) - Perl regular expressions regex (7) - POSIX 1003.2 regular expressions regexp (n) - Match a regular expression against a string regsub (n) - Perform substitutions based on regular expression pattern matching zgrep (1) - search possibly compressed files for a regular expression re (3) - Perl pragma to alter regular expression behaviour


Вот это называется, то что доктор прописал, получили меньше десятка страниц руководства которые относятся к интересующим нас выражениям. Сразу отбрасываем страницы относящиеся к битмапам и к перлу, в результате остается выжимка информация которая с большой вероятностью именно то что нужно. По идее более всего нам подходит третья строка regex из 7-го раздела.

Раздел это то, чего указано в скобках, для одного и того-же ключевого слова может найтись несколько страниц в разных разделах руководства, поэтому во всех доках и большинстве книжек по UNIX-ам при ссылке на руководство, указывается и раздел в котором содержится информация. Хотя в большинстве случаев нужная команда имеется в единственном экземпляре, и раздел указывать не обязательно. Но не в нашем случае, набрав man regex, к удивлению мы попадаем в третий раздел, где описаны Си-шные функции для работы с выражениями, но мы пока новички, и Си нам даром не нужен. Поэтому на всякий случай посмотрим раздел SEE ALSO, и там опять таки видим ссылку на 7-й раздел руководства с командой regex(7). Для того чтобы явно указать Мане к какой странице руководства обращаться, нужно набрать man 7 regex, вот теперь мы попадем именно на ту страницу, которая нам была и нужна. Есть еще один способ для просмотра всех страниц связанных с заданной командой, эта возможность включается с помощью ключа -a, так набрав man -a regex, сначала мы увидим страницу из третьего раздела, убедившись что она нам не подходит, мы выходим из less по q, нам сразу показывается следующая найденная страница, в нашем случае из 7-го раздела. Довольно таки удобно.



Еще до купы несколько полезных ключей:

  • man -f или whatis - выводит название и заголовок страницы, соответствующей введенной в качестве параметра команде или теме, может применяться для выяснения того что та или иная программа делает в принципе, без лишних деталей:

    $ whatis 7 regex regex (7) - POSIX 1003.2 regular expressions

    так сказать краткая информация о команде;
  • man -K - команда для параноиков, с ее помощью осуществляется поиск вхождения заданного текста не только в названиях и заголовках статей, но и внутри самих статей, по мере нахождения страниц руководства с заданным словом, вам будет предлагаться на выбор просмотреть найденную страницу, пропустить ее, или подвязать с этим занятием. Естественно Маня с таким ключем тормозит по полной программе, ведь в большинстве случаев каждая страница распаковывается, в ней ищется нужное слово, если не находится то Маня делает тоже самое со следующей страницей, короче перелопачиваются все два десятка мегабайт текстовой информации, хотя тормозит тоже относительное понятие, скажем что результат появляется не моментально, на моем третьем пентиуме перелопачивание базы заняло минуту:



    $ time man sfgfg Command exited with non-zero status 1 27.07user 19.10system 0:55.31elapsed 83%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (1418055major+438160minor)pagefaults 0swaps

    Сознательно была введена несуществующая команда, чтоб Маня помучилась и перевернула всю базу. Есть способ сократить поиск, ограничив с помощью ключа -S, разделы в которых производить поиск;
  • man -t - данный ключик пригодится если вам нужно вывести некоторую страницу руководства на печать, вообще говоря, по умолчанию, используется пост-скриптовый драйвер, и соответственно на выходе man -t regex, мы получим пост-скрипт документ который можно непосредственно перенаправить на принтер, если конечно он у вас поддерживает PostScript. Если не поддерживает, то есть варианты. Наиболее предпочтительно поставить какой нибудь модный фильтр, типа apsfilter или a2ps, которые могут громадное количество входных форматов перевести в пост-скрипт, а там уже садится ghostscript с конкретным драйвером вашего принтера, и переводит из пост-скрипта, на понятный вашему принтеру язык. Ну это я чегото отвлекся, в другой раз про принтеры может расскажу, а может и не расскажу.

    Есть еще один способ вывести man-овскую страницу на принтер, при условии что он из серии HP LJ4L или старшие модели LJ. В /etc/man.config вносятся изменения, после которых мы видим следующее:

    $ cat /etc/man.config | grep TROFF #TROFF /usr/bin/groff -Tps -mandoc -P-g TROFF /usr/bin/groff -Tlj4 -mandoc -P-g #TROFF /usr/bin/groff -Thtml -mandoc -P-g

    Первая из выведенных строк - старый вариант, формирующий пост-скрипт, а вторая, после моих изменений, и формирующая вывод понятный LaserJet-у. Также есть драйвер для groff, формирующий на выходе html, для этого нужно раскоментарить третью строку, а вторую закоментарить.

    За точность не ручаюсь, т.к. принтера под рукой нету, и проверить не могу, но когдато такой вариант катил;

  • man -w и man -wa - ключ -w отключает вывод собственно страницы руководства, вместо этого печатается имя файла содержащего эту страницу, отмечу, что на каждую команду свой файл. Совместно с ключем -a, выводит все найденные файлы по данной команде. Пример:



    $ man -w regex /usr/man/man3/regex.3.gz $ man -wa regex /usr/man/man3/regex.3.gz /usr/man/man7/regex.7.gz

    Здесь в первом случае печатается только первый найденный файл, а во втором все найденные файлы по данному ключевому слову.

    Еще одна интересная комбинация ключа -w с ключем -K, в этом случае выводятся только имена файлов содержащих вхождение искомой подстроки:

    $ man -wK httpd /usr/local/man/man1/wml_p3_eperl.1 /usr/man/man8/logrotate.8.gz /usr/man/man8/suexec.8.gz /usr/man/man8/rotatelogs.8.gz /usr/man/man8/logresolve.8.gz /usr/man/man8/httpd.8.gz /usr/man/man8/ab.8.gz /usr/man/man1/man2html.1.gz /usr/man/man1/perlfaq3.1.gz /usr/man/man1/htpasswd.1.gz /usr/man/man1/htdigest.1.gz /usr/man/man1/dbmmanage.1.gz /usr/lib/perl5/man/man3/CGI::Fast.3.gz /usr/lib/perl5/man/man3/CGI.3.gz

    Здесь выводятся все страницы руководства в которых упоминается httdp, недостатки подхода - медленность и мало информативность, о содержимом файла приходится догадываться только по его названию. Как вывести с помощью ключей заголовок файла я не нашел, поэтому сделал простую команду, которая эквивалентна предыдущей, но вместо имени файла, выводит имя команды и заголовок страницы руководства, что может значительно облегчить поиск нужной страницы:

    $ man -wK httpd | sed 's?.\+/\([^.]\+\)\.\([0-9]\+\).*$?\2 -f \1?' | xargs man logrotate (8)- rotates, compresses, and mails system logs suexec (8)- Switch User For Exec rotatelogs (8)- rotate Apache logs without having to kill the server logresolve (8)- resolve hostnames for IP-adresses in Apache logfiles httpd (8)- Apache hypertext transfer protocol server ab (8)- Apache HTTP server benchmarking tool man2html (1)- format a manual page in html perlfaq3 (1)- Programming Tools htpasswd (1)- Create and update user authentication files htdigest (1)- Create and update user authentication files dbmmanage (1)- Create and update user authentication files in DBM format CGI::Fast (3)- CGI Interface for Fast CGI CGI (3)- Simple Common Gateway Interface Class CGI::Apache (3)- Make things work with CGI.pm against Perl-Apache API CGI::Carp (3)- CGI routines for writing to the HTTPD (or other) error log CGI::Cookie (3)- Interface to Netscape Cookies CGI::Fast (3)- CGI Interface for Fast CGI CGI::Push (3)- Simple Interface to Server Push CGI::Switch (3)- Try more than one constructors

    Согласитесь более цивилизованный вид. Данную команду можно запихнуть в ваш .bashrc в виде функции:

    $ cat # .bashrc ......... # User specific aliases and functions if [ "$PS1" -a -f ~/lib/advhist.sh ]; then manK() { man -wK $1 | sed 's?.\+/\([^.]\+\)\.\([0-9]\+\).*$?\2 -f \1?' | xargs man } fi ........

    После этого желаемый результат достигается командой manK httpd, вместо того заклинания которое вы видели выше.


  • Еще посоветую при поиске информации обязательно заглядывать в секцию SEE ALSO, в которой могут быть масса полезных ссылок.

    Вот в общем и все что я хотел сказать по поводу man. Надеюсь теперь вам будет намного легче найти требуемую информацию.

    ....продолжение следует.....


    Содержание раздела