„-- В конце концов, -- сказал он невесело, --
ничего
страшного нет. Вот в Китае разыскать нужного
человека
трудновато: там живет четыреста миллионов населения. А у
нас
очень легко: всего лишь сто шестьдесят миллионов, в три
раза
легче, чем в Китае.“
Илья Ильф и Евгений Петров.
Золотой теленок.
После того как я установил Linux, встал вопрос где что находится, как это что искать, а найдя это нечто чего с ним делать?
Линукс конечно не Китай, и команд у него меньше чем населения в Китае, но все равно достаточно чтобы ввести новоиспеченного Линуксоида в недоумение, как в такой массе информации, разбросанной, казалось бы, в самых неподходящих местах, вообще можно ориентироваться?
Так поиск с помощью команды find, дает нам следующие результаты:
$ find / -type f -perm +111 | wc -l 3107 $ find /usr/man -type f -name "*.gz" 2>/dev/null | wc -l 3326 $ find /usr/man -type f -name "*.gz" -exec zcat {} \; 2>/dev/null | wc -c 23052138
Отсюда видно что количество найденных выполняемых файлов в моей системе
- 3107 штук! А количество страниц руководства
, которую я ласково называю
Маня, равно 3326, общий обьем страниц руководства равен
больше 23 Мб! В таком количестве информации без хороших
навигационных инструментов, можно запросто сесть на мель, с которой снятся
будет очень тяжело.
Как в речном, так и морском судоходстве, от которых я впрочем очень далек, есть куча навигационных инструментов, начиная от астролябий, компасов и карт, заканчивая супер современными GPS-ами, использующими в своей работе искуственные спутники земли. В каждой UNIX-подобной системе тоже есть свои навигационные инструменты, с помощью которых можно запросто пройти из точки А в точку Б, без значительных потерь в количестве нервных клеток, которые как известно не восстанавливаются. И если уж проводить аналогию с мореплаванием, то я так думаю что без спутников тут тоже не обошлось. А как-же. Просто это менее заметно, но когда вы пытаетесь найти помощь в интернете, так или иначе наверняка нужная вам информация проскочит через тот, или иной спутник, висящий где то между Луной и созвездием Альфа-центавра.
find
,
на русский язык, то получится нечто вроде „искать в каталоге /usr/man
все файлы с расширением .gz, затем
каждый из файлов вывести в распакованном виде, с помощью команды zcat, на стандартный
вывод“, а там уже будет ждать wc который подсчитает
количество символов во всех найденных файлах;
find
, в случае если вам нужно
найти файл по его имени. Это связано с тем что данная команда ищет файлы
не в самой файловой системе, как это делает
find
, а в предварительно
сформированной базе, в которой хранится список всех файлов в системе,
поэтому поиск осуществляется на несколько порядков быстрее, да и ваша
система, не будет так сильно загружена, как в случае использования
find
. Однако, у утилиты есть
недостаток, она не находит файлы, появившиеся уже после обновления базы,
а база обновляется обычно по расписанию, командой locate -u;
man
, ласково-уменьшительно
Маня
или
Манечка
, видимо поэтому она
делится со мной всеми своими секретами. Форма вызова
man <команда>
, в
результате мы получаем на экране отформатированную страницу руководства
по требуемой команде;
man
, и
является эквивалентом вызову
man
с ключем
-k
, что означает поиск
вхождения ключевого слова, как в именах команд, присутствующих в
справочнике man
, так и в
заголовках страниц руководства;
man
, эквивалентная команде
man -f
, из названия ясно, что
помогает определить для чего нужна та или иная команда, причем
информация дается довольно краткая, в одну две строки;
dir
,
это как раз дальний родственник
ls
, который из за врожденного
плоскостопия, слабоумия и близорукости практически издох в последних
версиях ВЫНЬ ХХ( это кроме того связано с повсеместным внедрением так
называемого „оконного интерхфейса“);
ls
, который
рисует дерево каталогов, или переводя на псевдонаучный язык
„визуализирует обьекты файловой системы, их атрибуты, и структурные
связи между ними“, о как сказал!. Умеет раскрашивать имена файлов и
каталогов в зависимости от их типа. Моя любимая команда в этом плане
tree -C | less -r
, с помощью
которой можно в цвете рассматривать, не какие нибудь каталоги-кустики, а
настоящие баобабы( дерево такое большое. Из курса школьной ботаники
помнится мне что на пенечке такого деревца легко умещается симфонический
оркестр! Просьба не путать с бабами, которых кстати тоже довольно
приятно рассматривать в цвете);
info
- кладезь
информации, чем то напоминает
man
, но с более продвинутыми
средствами навигации по темам, под темам. Можно сказать что здесь мы
имеем нечто похожее на гипертекст. Многие крупные пакеты, не имеют, или
имеют очень краткую справочную информацию в
man
, но зато в
info
- имеется этой
информации более чем достаточно. В частности именно с помощью
info gcc
и
info libc
, была найдена
обширная документация по gcc
и glibc
, которую я по
незнанию вначале скачал c другой стороны планеты, в виде запакованных
html-файлов, а потом как оказалось они в виде
info-файлов
спокойно лежали
на моем винте. Следует отметить что информация в
man
, это в некотором роде
подмножество информации info
,
дело в том что если info
не
может найти в своей базе информацию по некоторому вопросу, то она без
лишних раздумий выводит то, что говорит
man
по этому поводу.
PATH
,
затем среди страниц руководства
man
плюс в исходных текстах;
PATH
, а также в определениях
алиасов. По умолчанию выводит первую найденную команду вместе с полным
путевым именем. Может пригодится в случаях когда команда ведет себя не
так как ожидалось, А все может обьясниться тем что у вас две версии
данной программы, а по умолчанию выполняется первая найденная с помощью
переменной PATH
, команда. Или
просто вам необходимо знать где лежит та или иная команда;
rpm
;
pwd
, просто печатающая
текущую директорию;
ключи --help и --version
- иногда полезно просмотреть краткую подсказку, чем листать огромный
man
, а также представляет
некоторый интерес информация о версии той или иной программы;
На кажущуюся простоту
являет собой довольно мощную утилиту для просмотра текстовых файлов, можно
сказать что она справляется со своей задачей на твердую пятерку с плюсом.
Однако у новичков, особенно после гипертекстовых систем помощи
распространенных в ВЫНе, сия утилита может вызвать некоторое
разочарование, которое связано исключительно с неумением ею пользоваться.
А так как по умолчанию именно
является дежурным
просмоторщиком
-страниц, то
считаю просто необходимым рассмотреть основные его возможности и способы
их использования.
В стародавние времена народ заколупался выводить большие листинги
программ с помощью обычного cat, который не умел
выводить файлы по частям, а выплевывал на экран все содержимое файла
целиком, тогда какой то умный дядька придумал утилиту more, которая выводила
информацию постранично, выведет страницу и ждет, когда юзер скажет еще
мол, и выводит еще одну страницу, поэтому и называлась она
. Но у юзеров была
дырявая память, и они забывали что было написано на предыдущей странице,
но вернуться назад
, не
умел, чем очень расстраивал забывчивых юзеров, которым приходилось
заново перезапускать его, тогда другой добрый дядя написал утилиту,
которая умела листать файлы как вперед, так и назад, юзеры остались
довольны, осталось придумать название утилиты. И в свойственном юникс
стиле, в противоположность
; назвали утилиту
.
О названиях тех или иных команд, можно говорить очень долго, на ум
приходит история с
, имя
которой происходит от слова конкатенация, соединение. Как-то мне
понадобилось получить строки файла в обратном порядке, я на 100% был
уверен что такая утилита должна быть, ее просто на может не быть. Искал
долго и нудно, даже предполагал что она должна както хитро называться, я
бы не удивился если бы она называлась
. Уже не помню как я нашел
то что мне было нужно..... Оно называлось tac! Забавно не
правда-ли?
- задом
наперед. Игра словами очень характерная черта для юникс, сюда же можно
приплести и такие название как GNU, YACC, bash, hurd. Всего не упомнишь.
man
less
, на экране появится соответствующая страница
руководства, давайте посмотрим как можно перемещаться по ней:
space f
enter e j
d ^D
b ^B
y k
u ^U
g
G
r
F
{ }
[ ] ( )
, предназначены для
соответствующих скобок;
m <char>
' <char>
^,
$
, предопределены и являются метками начала и
конца файла соответственно. Двойное нажатие на
'
- возврат в позицию файла в
которой вы были пред последним большим перемещением. Кроме позиции в
файле запоминается имя самого файла, то бишь при просмотре нескольких
файлов можно ставить метки в разных файлов и переходить между ними;
/pattern
/^ +text
, с помощью него
ищется текст, находящийся в начале строки, таким образом можно найти к
примеру описание нужного ключа, так если нужно найти описание
-S
, то в качестве запроса
задаем /^ +-S
, и находим то
что требуется. Если сразу после косой черты ввести один из следующих
символов: ^N или !,^E или *, ^F или @, ^K,
^R
, то это изменит характер поиска. Так
^N или !
- инвертируют
результат поиска, т.е. будет искаться строка не соответствующая запросу,
^E или *
- говорит о том что
вести поиск в нескольких файлах, так если в текущем файле строка найдена
не будет, то поиск будет продолжен в следующем файле заданном в
командной строке, ^F или @
-
произвести поиск начиная с первой строки, первого файла указанного в
командной строке, ^K
-
произвести поиск с сохранением текущей позиции, так соответствующие
шаблону подстроки будут просто подсвечены, а текущая позиция не
изменится, и наконец ^R
-
выключает интерпретацию регулярных выражений в строке поиска;
?pattern
n и N
:n :p :x
! <shell-command>
| <mark>
<shell-command>
.
- то
передается текущий экран;
s filename
q
.bash_profile
, определить
переменную окружения LESS
. В
моем файле используется следующее определение: $ grep LESS .bash_profile export LESS='-i -W -a -F -j10 -R -s -S -C \\ -P?fFile\:%f:pipe.?m(%i of %m).?db Pg\:%db?L of %D..?Pb(%Pb\%).?e EOF. ?x Next\:%x.'Столь длинное определение связано с тем что описывается формат вывода информационной строки, в котром указывается имя текущего файла, номер текущей страницы, плюс общее количество страниц в файле, и текущая позиция в процентах, кроме того сообщается когда достигнут конец файла и имя следующего файла, если он конечно есть. Вся эта информация задается опцией
-P
. Остальные опции
выполняют следующие функции:
-i
-W
-a
-F
-j10
-R
tree -C
, которая выводит
дерево каталогов с выделением цветом, по типам файлов;
-s
-S
ESC-(
или
LEFTARROW
и
ESC-)
или
RIGHTARROW
, котрые делают
горизонтальную прокрутку отображаемого файла, что дает возможность
просмотреть сильно длинные строки;
-C
-F
, для просмотра небольших
файлов, длинна которых меньше размера экрана. LESSOPEN
: $ echo $LESSOPEN |/usr/bin/lesspipe.sh %s
Приведенное выше значение используется по умолчанию в моей красной
шапке. Скрипт
занимается тем что определяет тип файла, и если это не простой текстовый
файл, и известен способ его преобразования в текст, то это преобразование
выполняется а результат отображается на экране. Так скажем при задании
команды
, будет
показан уже распакованный файл, а не сам архив. Данная возможность делает
работу с файлами различных типов прозрачной для пользователя. Скажем если
в качестве параметра задать
, то будет выведено не
его двоичный образ, а общая информация по нему плюс список всех файлов с
атрибутами, входящими в данный пакет. Вместо указанного скрипта может
применяться ваш собственный, понимающий расширенный список типов файлов.
На этом повествование о
разрешите закончить. Перейдем к следующей теме.
В данном параграфе рассмотрим те способы, с помощью которых можно получить информацию по интересующему нас вопросу.
Для наглядности я поставлю перед собой вопрос, и попытаюсь показать как можно на него ответить, используя рассматриваемые команды. Иногда для того чтобы более широко раскрыть тему, и продемонстрировать парочку дополнительных приемов, я сознательно не буду замечать решения, которое лежит на поверхности:
Итак, как говорил Ворошилов, вопрос господа: Что же такое
регулярные выражения и с чем их едят? - вопрос отнюдь не праздный
и очень важный, поэтому попытаемся найти всю или почти всю информацию
касающуюся данной темы. На иностранном языке эти самые выражения
называются regular expression
, возьмем для зацепки первое слово,
- это и будет наша
отправная точка.
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, к удивлению
мы попадаем в третий раздел, где описаны Си-шные функции для работы с
выражениями, но мы пока новички, и Си нам даром не нужен. Поэтому на
всякий случай посмотрим раздел
, и там опять таки видим ссылку на 7-й раздел
руководства с командой
. Для того чтобы явно
указать Мане к какой странице руководства обращаться, нужно набрать man 7 regex, вот теперь
мы попадем именно на ту страницу, которая нам была и нужна. Есть еще один
способ для просмотра всех страниц связанных с заданной командой, эта
возможность включается с помощью ключа
, так набрав
, сначала мы увидим
страницу из третьего раздела, убедившись что она нам не подходит, мы
выходим из
по
, нам сразу показывается
следующая найденная страница, в нашем случае из 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. В
вносятся
изменения, после которых мы видим следующее:
$ 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Здесь в первом случае печатается только первый найденный файл, а во втором все найденные файлы по данному ключевому слову.
Еще одна интересная комбинация ключа
с ключем
, в этом случае выводятся
только имена файлов содержащих вхождение искомой подстроки:
$ 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
, вместо того
заклинания которое вы видели выше. Еще посоветую при поиске информации обязательно заглядывать в секцию
, в которой могут быть
масса полезных ссылок.
Вот в общем и все что я хотел сказать по поводу
. Надеюсь теперь вам будет
намного легче найти требуемую информацию.