man-db

Komanda man ima jedno ograničenje: moraš znati ime komande. A najčešća situacija je obrnuta — znaš šta hoćeš da uradiš, ali ne znaš kako se to zove.

Za to postoji pretraga po ključnoj reči. Nju obezbeđuje paket man-db, koji na većini distribucija upravlja celokupnom dokumentacijom.

$ apropos "disk space"
df (1)               - report file system disk space usage
du (1)               - estimate file space usage
ncdu (1)             - NCurses Disk Usage

Nisi znao da postoji ncdu, a sad znaš. To je cela poenta ove stranice.

Tri komande, jedan alat

man-db donosi tri komande koje rade nad istom bazom:

  • apropos — traži ključnu reč u opisima svih man stranica
  • whatis — ispisuje jednorednи opis poznate komande
  • mandb — gradi i osvežava tu bazu

Prve dve imaju i oblik kroz man, i to je ono što ćeš češće sretati u tuđim primerima:

$ man -k disk      # isto što i apropos disk
$ man -f ls        # isto što i whatis ls

apropos — kad ne znaš ime komande

$ apropos compress
bzip2 (1)            - a block-sorting file compressor
gzip (1)             - compress or expand files
xz (1)               - Compress or decompress .xz files
zless (1)            - file perusal filter for crt viewing of compressed text

Broj u zagradi je sekcija priručnika, i nije ukras. Ista reč često postoji u više sekcija:

$ apropos passwd
passwd (1)           - change user password
passwd (5)           - the password file
chpasswd (8)         - update passwords in batch mode

Sekcija 1 je korisnička komanda, sekcija 5 je format fajla, sekcija 8 je administratorska komanda. Kad ti treba baš određena:

$ man 5 passwd

Filtriranje po sekciji

Pretraga po opštoj reči ume da vrati stotinak redova. Sužavanje:

$ apropos -s 1 network | head
arp (8)              - manipulate the system ARP cache
ip (8)               - show / manipulate routing, network devices

Za više sekcija odjednom: apropos -s 1,8 network.

Kako se tumači ono što upišeš

Ovo redovno iznenađuje. apropos traži deo reči, ne celu reč:

$ apropos -s 1 dir | wc -l
73

Sedamdeset tri rezultata, jer se „dir" nalazi u „directory", „redirect", „indirect". Za tačno poklapanje postoji -e:

$ apropos -e dir
dir (1)              - list directory contents

Više reči se podrazumevano tretira kao „bilo koja od njih":

$ apropos copy file        # sve gde se javlja "copy" ILI "file"
$ apropos -a copy file     # samo gde se javljaju obe

Opcija -a je ono što najčešće želiš. Alternativa je navodnik oko cele fraze, kao u prvom primeru na ovoj stranici — o razlici navodnika piše na stranici Džokeri i navodnici.

Podržani su i džokeri, uz -w:

$ apropos -w "ssh*"
ssh (1)              - OpenSSH remote login client
ssh-add (1)          - adds private key identities to the OpenSSH agent
ssh-keygen (1)       - OpenSSH authentication key utility

whatis — brza provera šta je nešto

$ whatis tee
tee (1)              - read from standard input and write to standard output and files

Razlika u odnosu na apropos: whatis traži samo po imenu stranice i to tačno, dok apropos pretražuje i opise.

Korisno kad naiđeš na nepoznatu komandu u tuđoj skripti, a ne želiš da otvaraš celu man stranicu. Radi i sa više argumenata:

$ whatis awk sed cut
awk (1)              - pattern scanning and text processing language
sed (1)              - stream editor for filtering and transforming text
cut (1)              - remove sections from each line of files

mandb — zašto je to baza, a ne pretraga

Ovde počinje ono što stranicu čini korisnom u praksi.

apropos ne pretražuje man stranice u trenutku kad je pokreneš — to bi trajalo predugo. Umesto toga čita gotov indeks, koji stoji u /var/cache/man:

$ ls /var/cache/man
CACHEDIR.TAG  index.db  oldlocal

Ista logika kao kod locate i njegove updatedb baze: brzo je, ali može biti zastarelo.

Kad instaliraš paket, njegove man stranice se pojave na disku odmah, ali u indeksu tek kad se on osveži. Zato ovo ume da se desi:

$ apropos nginx
nginx: nothing appropriate.

$ man nginx        # a stranica postoji!
NGINX(8)                    Maintenance Commands

Rešenje je osvežavanje indeksa:

$ sudo mandb
Purging old database entries in /usr/share/man...
Processing manual pages under /usr/share/man...
0 man subdirectories contained newer manual pages.
248 manual pages were added.
0 stray cats were added.

Na Debian i Ubuntu sistemima ovo se ionako radi automatski jednom dnevno. Ako sistem nije bio uključen u to vreme — a serveri i kontejneri često nisu — indeks kaska. Kad ti apropos tvrdi da nema ničega, prvo pokreni mandb.

Poruka koja izgleda kao greška, a nije

$ apropos rutiranje
rutiranje: nothing appropriate.

Opisi man stranica su na engleskom, bez obzira na to kako ti je podešen sistem. Traži na engleskom.

Kad ni to nije dovoljno: man -K

Veliko K traži kroz ceo tekst svih stranica, a ne samo kroz jednoredne opise:

$ man -K "cannot allocate memory"
--Man-- next: malloc(3) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]

Nudi ti stranicu po stranicu. Sporo je — prolazi kroz hiljade fajlova — ali ponekad je jedini način da nađeš objašnjenje neke tačno određene poruke o grešci. Ostavi da radi i sačekaj.

Kombinacije sa drugim alatima

Rezultat apropos je običan tekst, pa se dalje obrađuje kao i svaki drugi — o čemu ima više na stranici Piping i redirekcija.

$ apropos . -s 1 | wc -l
1847

Tačka kao obrazac znači „bilo šta", pa ovo prebroji sve korisničke komande za koje na sistemu postoji dokumentacija.

Dvostepena pretraga, kad prvi rezultat vrati previše:

$ apropos -s 1 file | grep -i compress
zless (1)            - file perusal filter for crt viewing of compressed text

I ispis kroz pejdžer kad je spisak duži od ekrana:

$ apropos network | less

Radni tok koji vredi usvojiti

Ovako izgleda traženje rešenja bez otvaranja pretraživača:

$ apropos -a monitor process
pidstat (1)          - Report statistics for Linux tasks
top (1)              - display Linux processes

$ whatis pidstat
pidstat (1)          - Report statistics for Linux tasks

$ man pidstat

Tri koraka: pronađi kandidate, proveri koji od njih zvuči kao ono što ti treba, otvori dokumentaciju. Za razliku od odgovora sa foruma, ovo je uvek tačna verzija za sistem na kom radiš.

Kad dokumentacije uopšte nema

Na minimalnim instalacijama i u Docker kontejnerima man stranice se brišu da bi slika bila manja:

$ man ls
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

Na Ubuntu sistemima vraćaju se komandom:

$ sudo unminimize

Ako je u pitanju tuđi kontejner koji ne smeš da menjaš, gotovo svaka komanda ima i ugrađenu kratku pomoć:

$ ls --help | head -5

To nije zamena za man stranicu, ali obично sadrži spisak opcija — što je ono zbog čega je najčešće i otvaraš.

Kratka referenca

  • apropos rec — traži po opisu · isto: man -k rec
  • apropos -a rec1 rec2 — moraju obe reči
  • apropos -e rec — tačno poklapanje, bez delova reči
  • apropos -w "obr*" — džokeri u obrascu
  • apropos -s 1,8 rec — samo određene sekcije
  • whatis komanda — jednoredni opis · isto: man -f
  • man -K "fraza" — pretraga kroz ceo tekst, sporo
  • sudo mandb — osveži indeks
  • man 5 passwd — otvori stranicu iz određene sekcije

Vežba

Sve reši bez pretraživača, koristeći samo alate sa ove stranice:

  1. Pronađi komandu koja ispisuje koliko dugo sistem radi.
  2. Pronađi sve komande čiji opis sadrži i reč „user" i reč „group", isključivo u sekciji 8.
  3. Utvrdi šta je getent, u jednom redu.
  4. Prebroj koliko man stranica iz sekcije 5 postoji na tvom sistemu.
  5. Osveži indeks i uporedi broj iz prethodnog zadatka pre i posle.

Ako peti zadatak da isti broj, to znači da ti je baza bila ažurna — i to je uredan rezultat.


Čitanje same man stranice, njena struktura i sekcije objašnjeni su na stranici man, a detaljnija GNU dokumentacija na stranici info.

Cela lekcija je deo vodiča Linux osnove.

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd