Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Работа в консоли Linux

Моя система помощи

Оригинал: Henry's Techno-Musings: My Help System
Автор: Henry Grebler,
Дата публикации: май 2010.
Перевод: В.Костромин.
Дата перевода: 03.06.2010 г.

Предисловие

Если доктор или электрик придет к вам в дом с пустыми руками, вы будете немного удивлены, не правда ли? Вы же ожидаете, что профессионал приходит со своим инструментом. Иначе, как он собирается делать свою работу?

А в компьютерной индустрии люди часто приходят на работу просто в костюме. И все! А иногда даже и не в костюме.

Странно, мы не только не ждем, что компьютерщик принесет свои инструменты, но часто даже сама идея о том, что ему нужны какие-то инструменты, кажется нам свидетельством его некомпетентности! Что?! Вы ищете номер телефона в справочнике! Что за размазня! Настоящий сисадмин должен помнить всю телефонную книгу!

Состав

Я не хожу на работу с пустыми руками; у меня всегда с собой большой набор инструментов, который помещается на CD. Этот набор включает в себя:

  1. HAL - Henry Abstraction Layer (прим.пер.: уровень абстракции Генри, что это такое, из статьи не понятно)
  2. Мышечная память
  3. Система помощи
  4. Файлы истории

Эта заметка посвящена третьему пункту в этом списке.

Мотивация

Если кто-то приходит ко мне и спрашивает "Знаешь ли ты, что такое SAN, Генри?"

Я отвечаю "Я не знаю, давай посмотрим."

	help san

В ответ я получаю расписание поездов на Sandringham и объяснение, что такое "nuisance calls" (что-то вроде "телефонного спама", прим. пер.), в дополнение к большому количеству практически полезной информации о SAN, накопленной за много лет.

Моя команда help есть нечто среднее между apropos и несколько модифицированной командой man. Она использует некоторые опции от apropos, но дает полный ответ подобно man, вместо того, чтобы ограничиваться только выдачей заголовков, подобно apropos.

Она отличается от man дополнениями. man содержит только краткую справочную информацию; информация, выдаваемая help больше похожа на то, что вы можете найти в HOWTO или руководстве пользователя. man стремится дать полную информацию по конкретной теме; информация, выдаваемая командой help часто фрагментарна, не полна и дает только самые основы.

В отличие от man, которая дает только чисто техническую информацию и только относящуюся к той системе, в которой я работаю в данный момент, моя команда help не ограничена одной платформой или только техническими деталями. Люди, которые меня знают, будут даже шокированы тем, что там есть информация по предложениям от Microsoft. Кроме того, я могу получить подсказку и по тому, как мне использовать мой банковский счет.

Вызов помощи

Чтобы воспользоваться своей системой помощи, я набираю

	help string
где string - это любая строка, которая может иметь отношение к интересующему меня вопросу. Например,
	help rpm
выдаст мне подсказку по rpm.

Мой каталог help

Информация для моей команды help размещается в каталоге $HOME/help. Насколько я могу видеть, первые записи в этом каталоге датированы августом 1992 года.

Каждая запись - это отдельный файл. Имя каждого файла, который должен быть доступен команде, начинается с help_. Вероятно, для этого была какая-то причина, но, честно сказать, я уже не помню. Возможно, я думал, что могут быть файлы других форматов (не текстовых, например, PDF), доступ к которым я буду получать каким-то другим способом. Я не использую подкаталогов в последнее время; я не могу припомнить, когда я это делал последний раз.

Но есть подкаталог с именем FIREFOX, который содержит сколько-то html-файлов; другой подкаталог называется HTML и содержит Quick_HTML_Reference.html; еще один называется fedora-install-guide-en_US. Но эти подкаталоги находятся на периферии моей системы помощи.

Главную роль в ней играют файлы help_*.

"Правила" очень просты:

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

Моя команда help

Моя команда help является функцией оболочки bash, определенной в одном из моих многочисленных стартовых скриптов (которые являются частью моего HAL).
function help {
# Если ни одного аргумента не задано, вызывается стандартная помощь bash

        if [ "$1" = "" ]
        then
                builtin help
                return
        fi
        echo 'For bash help, use builtin help'

# пропускаем backup-файлы:   
        (set -x; less `ls ~/help/help_*${1}* | grep -v '~$'`)
        if [ $? -ne 0 ]
        then                    # try for bash help
                builtin help $1
        fi
}

Первые несколько строк отражают тот факт, что я использую встроенную команду help оболочки bash. Так что если я просто наберу help, я получу обычную подсказку bash.

Строка в скобках делает всю основную работу. К ней мы еще вернемся.

Последние 4 строки предназначены для обеспечения сосуществования с bash. Теоретически, если в моей базе данных нет информации по нужному вопросу, обращаюсь к команде bash. Написав это, я обнаружил, что эта часть не работает! Это подтверждает известный закон, что каждая нетривиальная программа содержит ошибки.

Это также подтверждает то, что нечто не обязано быть совершенным, чтобы быть чрезвычайно полезным. "Лучшее - враг хорошего", как говорят.

Главная команда

	less `ls ~/help/help_*${1}* | grep -v '~$'`

Давайте начнем изнутри.

	ls ~/help/help_*${1}*

Здесь мы выводим список всех файлов в каталоге ~/help (то есть $HOME/help), которые начинаются с help_ и содержит указанную подстроку где-либо в остальной части имени.

Я использую в качестве редактора emacs. Он создает резервные копии файлов, имена которых содержат тильду (~) в качестве последнего символа в имени. Я не хочу видеть эти резервные копии файлов; grep удаляет их из списка.

Затем команда less выводит содержимое тех файлов, которые остались в списке. Иногда это один файл, чаще несколько.

Прежде чем говорить о моей команде less, я прокомментирую строку, заключенную в скобки. Она начинается с set -x. Много лет назад, когда я впервые познакомился с Unix (думаю, до того, как возник Linux), я где-то прочитал, что команды Unix делают свою работу молча. Это мне не нравится; я предпочитаю видеть множество подтверждений: вот что я делал; вот какую команду использовал; это файлы, с которыми я работаю.

Я не жду, что другие разделяют мои предпочтения. Если кто-то предпочитает молчание, тот может удалить set -x.

Моя команда 'less'

Использование less для просмотра нескольких файлов будет значительно менее удобным, если не использовать небольшие ухищрения.

Я предпочитаю использовать less(1) как программу просмотра и задаю ее в переменной $PAGER. Однако стандартная less требует небольших доработок. Мне хочется иметь возможность быстро переключаться с просмотра одного файла к следующему, и обратно. По умолчанию в less для этого используются команды :n и :p, но это требует нажатия трех клавиш. Это не совсем то, что мне хочется. Конечно, можно было бы запрограммировать функцию, которая будет генерировать :n и :p, но это тоже не то.

Я предпочитаю использовать клавиши СТРЕЛКА ВЛЕВО и СТРЕЛКА ВПРАВО. По умолчанию в less эти клавиши задействованы для горизонтальной прокрутки. Но я никогда не использую горизонтальную прокрутку в less, так что приспособил эти клавиши для перехода между файлами.

Я хочу, чтобы СТРЕЛКА ВПРАВО означала "следующий файл", СТРЕЛКА ВЛЕВО - "предыдущий файл".

Если вы захотите последовать моему примеру, используйте мой файл .lesskey и либо скопируйте его в свою домашнюю директорию, либо откорректируйте свой файл .lesskey. Как это сделать - смотрите man lesskey(1).

Затем выполните команду lesskey, чтобы превратить файл .lesskey в нечто, понятное less.

Анализ

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

Большая часть моего взаимодействия с компьютером происходит в командной строке, обычно через xterm. Если только возможно, я использую bash. То есть практически всегда: bash - оболочка, используемая в Linux по умолчанию (когда мы пишем /bin/sh это фактически bash); она в настоящее время стандартна (/bin/bash) для недавних версий Solaris; и она доступна в BSD. И если я не ввожу команды в командной строке, это означает только то, что я запустил emacs.

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

Так что редактирование файлов помощи - просто один из видов моей основной деятельности; ничего нового, ничего не надо осваивать.

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

Но что самое важное - все это в высшей степени портабельно. Куда бы я ни шел, я могу взять весь каталог (вместе с другими материалами) на CD и скопировать все это на локальный диск практически без временных затрат.

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

Обычно я просто выделяю фрагмент текста в источнике, с которым работаю, и копирую его в файл. Я просто делаю заметки для себя - примерно как записи для памяти на клочках бумаги.

Если, когда-либо позже, я снова возвращаюсь к этому файлу помощи, потому что работаю над той же проблемой, я могу что-то подправить, прояснить информацию для себя. Или нет.

Главная цель - экономия времени. Если я потратил долгое время, пытаясь разобраться, как сделать что-то, я не хочу повторно тратить время на эти упражнения в будущем.

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

Типичное использование

Давайте рассмотрим пример. Я недавно занимался FreeBSD, в которой я новичок. Давайте посмотрим, что мне показалось нужным знать.

	ls -lat $HOME/help/help_*bsd* | grep -v '~' | cut -c 30-
 3897 Mar 21 07:35 /home/henryg/help/help_freew_bsd_diary
 3030 Mar 19 14:50 /home/henryg/help/help_bsd_build_notes
  100 Mar 19 11:12 /home/henryg/help/help_bsd
  113 Mar 17 16:38 /home/henryg/help/help_bsd_admin
  261 Mar 17 10:37 /home/henryg/help/help_bsd_build

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

Если я просматриваю файл с помощью less и вижу, что его нужно модифицировать каким-либо образом, я просто ввожу команду v и перехожу в emacs для редактирования.

Если быстро найти нужный материал не получается, я могу использовать grep для поиска, поскольку файлы помощи - просто текстовые файлы. Можно также вывести список всех файлов помощи, в надежде, что что-то подскажут имена файлов.

Это редко случается, но давайте рассмотрим такую ситуацию. Предположим, что я ищу информацию о xxx и help xxx не выдает ничего полезного. Я воспользовался grep и нашел информацию. Почему help xxx не нашел соответствующий файл? Как я понимаю, я просто поместил информацию не в тот файл. Например, я сохранил данные в файле help_audio, а потом искал их с помощью команды help sound. На этот случай есть простое решение:

	mv help_audio help_audio_sound

Теперь я могу найти нужную информацию, используя любую строку (или подстроку). Например, любая из этих команд откроет упомянутый выше файл (и, возможно, другие):

        help aud
        help soun

Я могу отнести информацию к нескольким категориям. Просто нужно включить больше нужных слов (подстрок) в имя одного и того же файла помощи.

Содержание файлов помощи

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

Просто в качестве примера приведу часть моего файла help_rpm:

### О компиляции пакетов смотри help_rpm2
### О деинсталляции - смотри в help_rpm_uninstall
------------------------------------------------------------------------

RPM=wxpythongtk-2.4.2.4-1.rhfc2.nr.i386.rpm

rpm --query -p $RPM   -i
rpm --query -p $RPM   -l | cut -d / -f1-3 | uniq | head
rpm --query -p $RPM   -l | wc
rpm --query -p $RPM   -l

# Test Install
#                               rpm -i --test $RPM      # Use the long option
rpm --install --test $RPM
# Really install
#                               rpm -i $RPM             # Use the long option
rpm --install $RPM

++++++++++++++++++++++++++++++++++++++++++++++++
Инсталляция в экстремальных ситуациях:

rpm -i $RPM --force
rpm -i $RPM --nodeps            # Не проверять зависимости пакетов

Обычно, если мне нужно выполнить инсталляцию пакета, я задаю переменную RPM, затем копирую каждую из rpm команд в xterm. Можно даже отключить мозги и выполнять все действия на автопилоте.

Что более существенно, это значительно снижает объем набора на клавиатуре, экономит время и дает мне возможность сконцентрироваться на более глобальных вещах, а не на механизме инсталляции пакета.

Еще один пример: подсказка, выдаваемая по запросу pub. У меня есть два файла помощи, касающиеся общественного транспорта: help_public_transport и help_aaa_public_transport. Вначале я создал первый из них. Он содержит детальную информацию об автобусных маршрутах. Обычно мне не требуется знать все. Поэтому, когда я создавал второй файл, я поместил в начало имени строку aaa, так что теперь less всегда показывает этот файл первым (в силу того, что так работает ls)

Если мне нужно добраться куда-то общественным транспортом, я посещаю Viclink Journey Planner. Это великолепный ресурс, но он бывает слишком словоохотлив временами. Чтобы побыстрее получить нужный ответ, нужно задать более длинную строку. Я никогда не могу запомнить эти названия и, вероятно, никогда не смогу ввести их корректно. Поэтому моя система помощи содержит названия станций, которые я чаще всего посещаю:

Gardenvale Railway Station (Brighton)

Ormond Railway Station (Ormond)
Caulfield Railway Station (Caulfield East)
Malvern Railway Station (Malvern) 
Armadale Railway Station (Armadale) 

Southern Cross Railway Station (Melbourne City) 
Richmond Railway Station (Richmond)
Flinders Street Railway Station (Melbourne City)
Melbourne Central Railway Station (Melbourne City)

Я просто копирую соответствующую строку в форму на сайте и очень быстро получаю ответ.

Расширения

Проработав много лет в одной организации, я недавно заключил контракт с другой фирмой. Я подумал, что материал, который я собрал, работая в X Corp лучше поместить в каталог help_X_Corp, а материалы, имеющие отношение к Y Corp, должны размещаться в help_Y_Corp.

В результате мне пришлось немного модифицировать команду help. Ключевая строка:

	               v
	less `ls ~/help*/help_*${1}* | grep -v '~$'`
	               ^

Я вставил дополнительный символ астериска (*) для того, чтобы просматривать ВСЕ подкаталоги с помощью команды help.

В заключение

В основном это все. Каждый может приспособить то, что я сделал, к своим нуждам. В этом прелесть компьютеров и особенно - программного обеспечения с открытым кодом: практически бесконечная гибкость и приспособляемость. Жаль, что в основном мы тратим усилия на то, чтобы изменить внешний вид (на скины и темы).

То, что мы получаем "из коробки" подходит большинству, но не является чем-то, что идеально соответствует потребностям конкретного пользователя. Но каждый может приспособить систему к своим нуждам и желаниям - приложив соответствующие усилия.

Не имеет значения, являетесь ли вы компьютерным гуру или неофитом. Не имеет даже значения то, какую ОС вы используете (хотя в Microsoft это сделать сложнее). Вам нужен только текстовый редактор и средство для выбора и просмотра файлов. Единственная сложность, которую я вижу, это если вы работаете исключительно в графической оболочке, потому что тогда вы должны написать (или заказать кому-то разработку) программу выбора файлов (и, может быть, программу их отображения). Насколько я могу судить, Microsoft использует редактор (скажем, Wordpad) как средство отображения файлов.

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

Примечание

Я написал все это несколько дней назад. Но уже через день, делая небольшие исправления, я модифицировал свою команду помощи. Я привожу ее в разделе "Ресурсы" ниже.

Ресурсы

#	.lesskey - less keybinding file

#  Henry Grebler    26 May 98  Добавлена альтернатива горизонтальной прокрутки.
#  Henry Grebler    26 May 97  Первый вариант.
#=============================================================================#

# Замечание по комментариям:

#     Пустые строки и строки, начинающиеся знаком фунта (#), 
#     игнорируются, кроме строк в специальной заголовочной секции.

#=============================================================================#
# Замечание по использованию:

# Этот файл является только исходным файлом для команды lesskey. Запущенная без аргументов,
# lesskey обрабатывает $HOME/.lesskey (текстовый файл) и выдает $HOME/.less 
# (бинарный файл, который является инициализационным файлом для less).

#=============================================================================#

          x         quit
          X         quit
          \e[C        next-file
          \e[D        prev-file
          \eOC        next-file
          \eOD        prev-file

# По умолчанию  \e[ - это прокрутка влево. Однако, задание \e[C выше
# кажется отключает \e[ (понятно). Так что добавляю  \e{ как
# синоним левой прокрутки и \e} как синоним правой прокрутки 
# (запоздалая увертка для корректности).

#          \e{         left-scroll
#          \e}         right-scroll

Последний вариант моей команды help:

function help {
# В случае, когда аргументы отсутствуют, используем стандартную команду help

        if [ "$1" = "" ]
        then
                builtin help
                return
        fi
        echo 'For bash help, use builtin help'

# исключаем из рассмотрения резервные копии файлов:
        files=`ls ~/help*/help_*${1}* 2>/dev/null | grep -v "~$"`
        if [ "$files" = '' ]
        then                    # no matches: try for bash help
                builtin help $1
                return
        fi
        echo "$files"
        echo 'ls ~/help*/help_*'${1}'* | grep -v "~$"'
        less $files
}

Henry Grebler

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

Он использует Linux в качестве домашней системы с тех пор, как его семья приобрела свой первый персональный компьютер в 1996 году. Тогда в семье был только один компьютер, на котором было установлено две операционных системы: Windows/Slackware. Сейчас каждый член семьи имеет свой компьютер и Генри обретается в мире чистого Linux.

Он живет в пригороде Мельбурна, в Австралии.