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

„-- В конце концов, -- сказал он невесело, -- ничего
страшного нет. Вот в Китае разыскать нужного человека
трудновато: там живет четыреста миллионов населения. А у нас
очень легко: всего лишь сто шестьдесят миллионов, в три раза
легче, чем в Китае.“

Илья Ильф и Евгений Петров. Золотой теленок.

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

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

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

Перейдем к делу. Приведу небольшой такой списочек этих самых инструментов, с краткими пояснениями, что к чему: Вот таков минимум, которым надо владеть для более или меннее свободного общения с системой.

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

Перед тем как что-то искать, давайте разберемся чего будем делать с той информацией которую найдем. Любая Юникс подобная система, оснащена полезнейшей утилитой под названием 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-го раздела. Довольно таки удобно.

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

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

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

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