Среди океана команд

Основная проблема

После того как я установил 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 штук! А количество страниц руководства man, которую я ласково называю Маня, равно 3326, общий обьем страниц руководства равен больше 23 Мб! В таком количестве информации без хороших навигационных инструментов, можно запросто сесть на мель, с которой снятся будет очень тяжело.
Как в речном, так и морском судоходстве, от которых я впрочем очень далек, есть куча навигационных инструментов, начиная от астролябий, компасов и карт, заканчивая супер современными GPS-ами, использующими в своей работе искуственные спутники земли. В каждой UNIX-подобной системе тоже есть свои навигационные инструменты, с помощью которых можно запросто пройти из точки А в точку Б, без значительных потерь в количестве нервных клеток, которые как известно не восстанавливаются. И если уж проводить аналогию с мореплаванием, то я так думаю что без спутников тут тоже не обошлось. А как-же. Просто это менее заметно, но когда вы пытаетесь найти помощь в интернете, так или иначе наверняка нужная вам информация проскочит через тот, или иной спутник, висящий где то между Луной и созвездием Альфа-центавра.

Средства навигации

Перейдем к делу. Приведу небольшой такой списочек этих самых инструментов, с краткими пояснениями, что к чему:
  • find — команда монстр, с ее помощью можно найти все что вы хотите, а иногда даже то чего и не хотите. Предназначена для поиска файлов в файловой системе по заданным критериям. Над найденными файлами возможно выполнение некоторых действий, заданных вами. К примеру, если перевести третью из вышеприведенных команд find, на русский язык, то получится нечто вроде „искать в каталоге /usr/man все файлы с расширением. gz, затем каждый из файлов вывести в распакованном виде, с помощью команды zcat, на стандартный вывод“, а там уже будет ждать wc который подсчитает количество символов во всех найденных файлах;
  • locate — поиск файлов по их имени или шаблону имени, в качестве шаблона, можно использовать как метасимволы применимые в командной строке (*,? и т.п), так и регулярные выражения. Именно этой команде нужно отдавать предпочтение, перед find, в случае если вам нужно найти файл по его имени. Это связано с тем что данная команда ищет файлы не в самой файловой системе, как это делает find, а в предварительно сформированной базе, в которой хранится список всех файлов в системе, поэтому поиск осуществляется на несколько порядков быстрее, да и ваша система, не будет так сильно загружена, как в случае использования find. Однако, у утилиты есть недостаток, она не находит файлы, появившиеся уже после обновления базы, а база обновляется обычно по расписанию, командой locate -u;
  • man — справочник команд, наипервейший и наиглавнейший источник информации по командам и утилитам. За особые заслуги, я называю man, ласково-уменьшительно Маня или Манечка, видимо поэтому она делится со мной всеми своими секретами. Форма вызова man <команда>, в результате мы получаем на экране отформатированную страницу руководства по требуемой команде;
  • apropos — в моей системе это жесткая ссылка на сам man, и является эквивалентом вызову man с ключем -k, что означает поиск вхождения ключевого слова, как в именах команд, присутствующих в справочнике man, так и в заголовках страниц руководства;
  • whatis — опять таки жесткая ссылка на man, эквивалентная команде man -f, из названия ясно, что помогает определить для чего нужна та или иная команда, причем информация дается довольно краткая, в одну две строки;
  • ls — выдает список файлов в директории, плюс еще вагон разной информации о каждом из файлов. Кстати досовский dir, это как раз дальний родственник ls, который из за врожденного плоскостопия, слабоумия и близорукости практически издох в последних версиях ВЫНЬ ХХ (это кроме того связано с повсеместным внедрением так называемого „оконного интерхфейса“);
  • tree — продвинутый ls, который рисует дерево каталогов, или переводя на псевдонаучный язык „визуализирует обьекты файловой системы, их атрибуты, и структурные связи между ними“, о как сказал!. Умеет раскрашивать имена файлов и каталогов в зависимости от их типа. Моя любимая команда в этом плане tree -C | less -r, с помощью которой можно в цвете рассматривать, не какие нибудь каталоги-кустики, а настоящие баобабы (дерево такое большое. Из курса школьной ботаники помнится мне что на пенечке такого деревца легко умещается симфонический оркестр! Просьба не путать с бабами, которых кстати тоже довольно приятно рассматривать в цвете);
  • info — кладезь информации, чем то напоминает man, но с более продвинутыми средствами навигации по темам, под темам. Можно сказать что здесь мы имеем нечто похожее на гипертекст. Многие крупные пакеты, не имеют, или имеют очень краткую справочную информацию в man, но зато в info — имеется этой информации более чем достаточно. В частности именно с помощью info gcc и info libc, была найдена обширная документация поgcc и glibc, которую я по незнанию вначале скачал c другой стороны планеты, в виде запакованных html-файлов, а потом как оказалось они в виде info-файлов спокойно лежали на моем винте. Следует отметить что информация в man, это в некотором роде подмножество информации info, дело в том что если info не может найти в своей базе информацию по некоторому вопросу, то она без лишних раздумий выводит то, что говорит manпо этому поводу.
  • grep — поиск информации в файлах по заданному шаблону, применяется в задачах подобным следующим: найти все файлы из заданного списка, в которых упоминается выражение „Windows Forever“ (такой список может применяться для изничтожения таких файлов на вашей машине), или скажем такая задача найти все строки файла в которых встречается упоминание о Linux, и т.д. и т.п. Для совершенного владения этой утилитой нужно обязательно освоить регулярные выражения, причем они вам пригодятся не только здесь;
  • whereis — как можно догадаться из названия, утилита предлагает сервис под названием „где это?“, другими словами она пытается найти все что относится к введенной в качестве параметра команде и выводит список найденного. Поиск ведется среди выполняемых файлов, которые находятся в путях из переменной PATH, затем среди страниц руководства man плюс в исходных текстах;
  • which — производит поиск заданной в качестве параметра команды, во всех каталогах указанных в переменной PATH, а также в определениях алиасов. По умолчанию выводит первую найденную команду вместе с полным путевым именем. Может пригодится в случаях когда команда ведет себя не так как ожидалось, А все может обьясниться тем что у вас две версии данной программы, а по умолчанию выполняется первая найденная с помощью переменной PATH, команда. Или просто вам необходимо знать где лежит та или иная команда;
  • file — определить тип заданного в качестве параметра файла, утилита способная творить чудеса, для определения типа файла используется магический файл magic;
  • rpm — менеджер пакетов RedHat, к поиску имеет отдаленное отношение, но именно используя данную команду, ищется скажем тот пакет который содержит нужную вам программу. Кроме того не помешает знать как просмотреть ту или иную информацию по некоторому пакету;
  • tar — архиватор, вобщем-то приведен сюда по тем-же причинам что и rpm;
  • less — страничный пейджер, предназначен для просмотра текстовой информации, имеет удобные средства навигации;
  • tail — вывод конца файла;
  • head — вывод начала файла;
  • cd — смена текущей директории;
  • pushd — перейти в указанную директорию, а текущую запихнуть в стек;
  • popd — вынуть из стека директорию, и перейти в нее;
  • pwd — „И где я нахожусь?“ — на этот вопрос ответит вам pwd, просто печатающая текущую директорию;
  • ln — создает жесткую или символическую ссылку на файл или директорию;
  • rm — удаляет файл, файлы, директории. Будте бдительны, восстановлению удаленная информация, в большинстве случаев, не подлежит;
  • cp — копирование файлов, директорий;
  • mv — переименование и перемещение файлов и директорий;
  • регулярные выражения — один из мощнейших механизмов для поиска и редактирования текстовой информации. Поначалу вызывает трудности с пониманием, тем более что существуют несколько реализаций, это так называемые базовые и расширенные регулярные выражения. Судя по всему называются они „регулярными“ потому как при их изучении регулярно возникает желание применять несколько другие выражения из области ненормативной лексики. Кстати имеют много с ними общего, так с помощью ограниченного количества не нормативных слов, можно выразить неограниченное количество эмоций и чувств, а с помощью ограниченного количества символов используемых в регулярных выражениях можно задать неограниченное количество шаблонов для поиска. При этом у людей незнакомых с традициями как одних так и других выражений, обе эти разновидности выражений создают впечатление бессмысленного набора единиц информации. Надо отметить что практически все утилиты тем или иным образом позволяют использовать регулярные выражения;
  • ключи --help и --version — иногда полезно просмотреть краткую подсказку, чем листать огромный man, а также представляет некоторый интерес информация о версии той или иной программы;
  • strings — копается во внутренностях бинарных файлов и выводит на печать все найденные текстовые строки, игнорируя при этом двоичный бред.
Вот таков минимум, которым надо владеть для более или меннее свободного общения с системой.

Прелюдия. Гуляем по ЛЕССу

Перед тем как что-то искать, давайте разберемся чего будем делать с той информацией которую найдем. Любая Юникс подобная система, оснащена полезнейшей утилитой под названием less.
На кажущуюся простоту less являет собой довольно мощную утилиту для просмотра текстовых файлов, можно сказать что она справляется со своей задачей на твердую пятерку с плюсом. Однако у новичков, особенно после гипертекстовых систем помощи распространенных в ВЫНе, сия утилита может вызвать некоторое разочарование, которое связано исключительно с неумением ею пользоваться. А так как по умолчанию именно less является дежурным просмоторщиком man-страниц, то считаю просто необходимым рассмотреть основные его возможности и способы их использования.
«Историческая справка»
В стародавние времена народ заколупался выводить большие листинги программ с помощью обычного cat, который не умел выводить файлы по частям, а выплевывал на экран все содержимое файла целиком, тогда какой то умный дядька придумал утилиту more, которая выводила информацию постранично, выведет страницу и ждет, когда юзер скажет еще мол, и выводит еще одну страницу, поэтому и называлась она more. Но у юзеров была дырявая память, и они забывали что было написано на предыдущей странице, но вернуться назад more, не умел, чем очень расстраивал забывчивых юзеров, которым приходилось заново перезапускать его, тогда другой добрый дядя написал утилиту, которая умела листать файлы как вперед, так и назад, юзеры остались довольны, осталось придумать название утилиты. И в свойственном юникс стиле, в противоположность more; назвали утилиту less. О названиях тех или иных команд, можно говорить очень долго, на ум приходит история с cat, имя которой происходит от слова конкатенация, соединение. Как-то мне понадобилось получить строки файла в обратном порядке, я на 100% был уверен что такая утилита должна быть, ее просто на может не быть. Искал долго и нудно, даже предполагал что она должна както хитро называться, я бы не удивился если бы она называласьdog. Уже не помню как я нашел то что мне было нужно….. Оно называлось tac! Забавно не правда-ли? cat — задом наперед. Игра словами очень характерная черта для юникс, сюда же можно приплести и такие название как 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



Приведенное выше значение используется по умолчанию в моей красной шапке. Скрипт lesspipe.sh занимается тем что определяет тип файла, и если это не простой текстовый файл, и известен способ его преобразования в текст, то это преобразование выполняется а результат отображается на экране. Так скажем при задании команды less file.txt.gz, будет показан уже распакованный файл, а не сам архив. Данная возможность делает работу с файлами различных типов прозрачной для пользователя. Скажем если в качестве параметра задать rpm-пакет, то будет выведено не его двоичный образ, а общая информация по нему плюс список всех файлов с атрибутами, входящими в данный пакет. Вместо указанного скрипта может применяться ваш собственный, понимающий расширенный список типов файлов.
На этом повествование о less разрешите закончить. Перейдем к следующей теме.

Вот из ит? 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, вместо того заклинания которое вы видели выше.