Subsections

Когато се нуждаем от помощ

man, whatis, apropos, info...

man(1) е най-често използвания инструмент за бързо достъпване на помощна информация за командите в Debian. Всъщност с man можем да видим доста повече информация, касаеща също така и системни извиквания, файлови формати и различни програми. Най-простото използване на man(1) е когато подаваме един единствен аргумент -- името на командата (функцията, програмата и т.н.) за която искаме да получим информация. От там насетне, задачата на man(1) е да открие страницата съдържаща съответния текст и да ни я покаже.

Нека опитаме да получим помощна информация за една друга важна команда в Debian -- cat(1).

manchev@shodan:~$man cat

Екранът ще се изчисти и man(1) ще изведе страницата с помощна информация за cat (FIXME: да се добави за разликата, когато man работи с cat(1) и с less(2): 1. чрез cat може да се чете само "надолу"; 2. чрез less може да се използва PageUp, PageDown) , която ще изглежда така:

Reformatting cat(1), please wait...
CAT(1)                           User Commands                          CAT(1)

NAME
       cat - concatenate files and print on the standard output

SYNOPSIS
       cat [OPTION] [FILE]...

DESCRIPTION
       Concatenate FILE(s), or standard input, to standard output.

       -A, --show-all
              equivalent to -vET

       -b, --number-nonblank
              number nonblank output lines

       -e     equivalent to -vE

       -E, --show-ends
              display $ at end of each line

       -n, --number
--More--

Когато текста предоставян ни от man не се събира на един единствен екран (както е в по-голямата част от случаите), man(1) показва първата страница, а на последния ред извежда инверсно "--More--". Това ни показва, че man очаква команда, след като прочетем изведената информация. Това, което правим в повечето случаи е:

(FIXME: Като се говори за more, да се ref-не тук)

Нека обърнем внимание на още един факт: man(1) не само съдържа описание на информацията, а я държи и в структуриран формат. Когато изпълняваме man(1) и получаваме помощ, в горната лява и дясна част от изхода на командата, виждаме изписано името на параметъра който сме подали (респективно, за който получаваме информация - в нашия случай -- cat(1)). В скоби до него виждаме стойност, която ни показва от кой раздел получаваме информация. Ето и списък на отделните раздели:

  1. Програми и команди на shell-a
  2. Системни функции (които се предоставят от kernel-a)
  3. Функции, реализирани в различни библиотеки
  4. Файлове със специално предназначение (например тези в /dev)
  5. Файлови формати и конвенции
  6. Игри
  7. Други
  8. Команди свързани с администрирането на системата (в повечето случаи, достъпни само за root)
  9. Специални функции на kernel-a

Ключов момент е, че man(1) претърсва за подадения параметър разделите в точно определения ред и извежда първата страница, която открие. Възможно е параметъра, който подаваме на man(1) да същесвува едновременно в няколко различни раздела. Именно затова man(1) резрешава да зададем в явен вид кой точно от разделите да се претърси за параметъра, без да се поглежда в другите части на документацията. Форматът на командата в този случай е:

man [име_на_раздел] какво_търсим

Ако man(1) не открие търсенето в посочения раздел, той не претърсва останалите. Ако зададем, например:

manchev@shodan:~$ man 1 cat

това ще работи коректно, защото така или иначе информацията за cat(1) е разположена в частта с програмите и различните shell команди. За сметка на това, ако зададем друга стойност на раздела (например 2) ще получим следното:

manchev@shodan:~$ man 2 cat
No manual entry for cat in section 2
See "man 7 undocumented" for help when manual pages are not available.

Веднага изниква въпросът дали има възможност да видим в кой раздел е разположена информацията която търсим и дали за параметъра, съгласно който искаме информация от man(1), не съществуват записи в повече от един раздел. Например, да предположим, че ни трябва описание на функцията clear, която е част от библиотеката curses (поддържа функции за работа с екрана, които са терминално независими и следователно много полезни). За съжаление, ако просто изпълним man clear ще видим информация за командата (а не функцията) clear. Командата clear(1) се използва за изчистване на екрана и няма нищо общо с това, което на нас ни трябва.

В този случай може да ни помогне командата whatis(1). Нека се върнем за момент към примерния изход от изпълнението на man cat показа по-горе. Още в самото начало на страницата, в частта NAME имаме името на командата, за която сме потърсили помощ (cat) и веднага след нея -- кратко нейно описание.

Това, което whatis(1) прави е да претърси всички раздели за страници отговарящи на името, което му подадем като параметър. После whatis(1) извежда списък, съдържащ съответно името, раздела и споменатото кратко описание. Да се върнем към случая с clear и да използваме whatis, за да си помогнем:

manchev@shodan:~$whatis clear
clear (1)         - clear the terminal window
clear (3ncurses)  - clear all or part of a curses window

Ето защо получаваме не това, което ни трябва - командата clear(1) е разполжена в по-преден раздел от функцията clear и съответно е първото нещо, което man(1) ни показва. Сега, след като се уверихме че това, което ни трябва е в третия раздел, можем да го достъп по вече познатия начин:

manchev@shodan:~$man 3 clear

Което ще ни даде точно това, което и търсехме.

Следващия въпрос, който е логично да си зададем е: След като имаме възможност да търсим по имена и да виждаме описание, не можем ли да направим търсенето така, че да бъде по думи споменати в описанието и така да получим самите имена, които после да разгледаме с man(1)?

Разбира се, че е възможно. И тук на помощ ще дойде командата apropos(1). Нека вземем следния пример -- искам да намеря такава команда, която да конвертира аудио диск в MP3 файлове, които да запиша в home директорията си и после да прослушвам с някакъв MP3 player.

Няма смисъл да си губим времето с whatis(1). Да опитаме чрез apropos(1):

manchev@shodan:~$apropos mp3
cdda2mp3 (1)        - extract audio CD audio tracks and encode them

Звучи точно като това, което търсим. Представете си, колко щяхме да налучкваме с whatis(1). От тук насетне можем веднага да погледнем:

manchev@shodan:~$man cdda2mp3

и да видим как правилно да използваме cdda2mp3(1). По въпроса за player-а можем да постъпим аналогично:

manchev@shodan:~$apropos player
xmms (1)            - an audio player for X.
xlsfonts (1x)       - server font list displayer for X
xprop (1x)          - property displayer for X
xwud (1x)           - image displayer for X

На пръв поглед, първият запис май ни върши работа. Въпросът е, че зад него са се наредили още няколко, които нямат никакво отношение към нашия случай. Това се е случило, защото apropos(1) търси стринга и в самите думи и е открил "player" в "displayer". В случая не е критчино, но когато имаме нужда от търсене точно на това което сме подали като параметър, можем да използваме опцията "-е" (exact -- точно съвпадение). Да опитаме:

manchev@shodan:~$apropos -e player
xmms (1)            - an audio player for X.

Така нещата стоят по-нормално. Разбира се, в нашия случай не беше толкова критично, но е полезно да имаме "-е" предвид, когато apropos ни върне неподходящи резултати.

Освен гореспоменатите начини за набавяне на помощна информация, също така може да се използва и info. GNU проектът разпространява голяма част от ръководствата си в "info формат", който може да бъде прочетен, използвайки "info reader (FIXME:четец)". За повече информация относно info можете да изпълните командата:

$ info info

FIXME: Да се добави повече инфо за info, например, за "браузването" в info и т.н.

Приключвайки с темата за man трябва да запомним едно основно правило: man(1), whatis(1) и apropos(1) няма да ни помогнат много, когато инструмента или командата която ни е нужна не е инсталирана. Ако на вашата система нямате инсталиран xmms, apropos -e player просто ще ви каже:

player: nothing appropriate

Още повече, направете си труда да видите какво връща apt-cache search player, за да видите колко много и разнообразни player-и могат да бъдат инсталирани на вашия Debian. Така че, ако не намерите инструмента който ви трябва по някой от описаните по-горе начини.

info

Друга основна команда, която ни е нужна когато търсим помощна информация е info(1). Тя се използва за четене на документи в Info формат. GNU разпространява голяма част от ръкводствата си в Info формат, затова е добре да можем да се справяме с инструмента за четене на този формат, а именно - Info.

Сега да опитаме нещо интересно -- да извикаме info(1) и да поискаме от него да ни покаже собствената си документацията. Ще процедираме точно като с man(1) -- предаваме един единствен параметър, показващ коя документация искаме да видим:

manchev@shodan:~$  info info

Ето какво ще видим на екрана, след изпълнението на "info info"

File: info,  Node: Top,  Напред: Getting Started,  Up: (dir)

Info: An Introduction
*********************

   Info is a program, which you are using now, for reading
documentation of computer programs.  The GNU Project distributes most
of its on-line manuals in the Info format, so you need a program called
"Info reader" to read the manuals.  One of such programs you are using
now.

   If you are new to Info and want to learn how to use it, type the
command `h' now.  It brings you to a programmed instruction sequence.

   To learn advanced Info commands, type `n' twice.  This brings you to
`Info for Experts', skipping over the `Getting Started' chapter.
   
* Menu:

* Getting Started::             Getting started using an Info reader.
* Advanced Info::               Advanced commands within Info.
* Creating an Info File::       How to make your own Info file.
--zz-Info: (info.gz)Top, 24 lines --Top----*** Tags out of Date ***-------------
Welcome to Info version 4.6. Type ? for help, m for menu item.

Документацията във формат Info е разделена на различни части (nodes), според темата коят засягат. Да погледнем погледнем първия ред (или хедъра) на този node.Там изписан node-а, в който се намираме, както и този който следва след него. Виждаме, че различните раздели, които info ни показва са логически свързани един с друг. След като се запознаем със съдържанието на node "Top" (който в нашия случай е интродукция), следва да преминем към частта "Getting started".

Из различните страници, които info извежда можем да навигираме с клавишите "n" (next - следваща) и "p" (previous - предходна). Ако натиснем "n" пред нас ще се изведе раздела "Getting started". Респективно ще се промени и хедъра, така че секция "Напред" ще бъде "Advanced Info", а ще се появи и секция Prev -- "Top", която показва кой е разделът, предшестващ "Getting started".

Да натиснем "p", за да се върнем в "Top". Ако погледнем долната част на екрана, можем да разберем, че тази страница е по-дълга от един екран. Ако информацията влизаше в рамките на екрана, долу щеше да бъде изписано "--All----" вместо "--Top----". За придвижване между страниците на текущия раздел използваме клавишите "PageUp" и "PageDown". Можем вместо тях да употребяваме и space и backspace, но ако с някой от тях достигнем границите на страницата, те автоматично ще ни прехвърлят към следващия(респективно предишния) раздел.

Освен линейното придвижване (чрез "n" и "p"), в info можем да използваме и менюта, чиито елементи водят директно към други раздели. Менюто можем да разпознаем по надписа "* Menu:". Всеки следващ елемент след "* Menu:" е връзка към друг раздел. В нашия случай (раздел "Top") имаме меню, както и определен брой елементи закачени към него:

* Menu:

* Getting Started::             Getting started using an Info reader.
* Advanced Info::               Advanced commands within Info.
* Creating an Info File::       How to make your own Info file.

Основно има два подхода за навигация из менюто. Единият е просто да се придвижим до елемента със стрелките на клавиатурата (или Tab - елемент по елемент) и да натиснем Enter. Другият, макар и да изглежда по-неинтуитивен е много мощен и бърз.

Другата възможност е да натиснем "m", което ще ни вкара в режим за работа с менюто. В долната част на екрана ще видим:

Menu item:

В този режим можем да напишем името на елемнта от менюто, а натискането на Enter ще ни прати в раздела, асоцииран с този елемент. Освен това:

Последното, което ще споменм е, че когато навлизаме навътре в дървото от node-ове можем да използваме клавиша "u", който ни връща обратно нагоре по структурата.

Казаното до тук е една съвсем малка част от възможностите на info(1). Ние можем да обхождаме различните раздели по име, да навигираме из подтеми по индекс, да редактираме info документи, да извършваме сложни търсения и още много други неща. Всички тези възможности може да научим направо от документацията на самото info(1) (info info). Не трябва да забравяме, че ако търсим нещо по-специфично, което не сме открили в man(1), добре е да погледнем в info(1). Неговите раздели в повечето случаи са доста по-пълни и по-подробни.



Nikola Antonov 2004-10-31