Le sezioni del manuale, ovvero perché man passwd a volte non risponde alla tua domanda

man apre la pagina di manuale di un comando. Gli sviluppatori le scrivono e le distribuiscono insieme al programma, per cui sono la fonte più vicina alla versione che hai davvero installato. La struttura è sempre la stessa: NAME, SYNOPSIS, DESCRIPTION, OPTIONS, FILES, EXIT STATUS, SEE ALSO.

Il punto che spiazza chi arriva da Windows è che il manuale è diviso in sezioni numerate, e lo stesso nome può comparire in più di una. In cima alla pagina trovi il numero fra parentesi, per esempio PASSWD(1).

$ man passwd        # sezione 1: il comando per cambiare password
$ man 5 passwd      # sezione 5: il formato del file /etc/passwd
$ man -a passwd     # mostra in sequenza tutte le sezioni disponibili

Le tre che devi ricordare a memoria sono 1 (comandi utente), 5 (formati di file e convenzioni) e 8 (comandi di amministrazione). Le altre: 2 chiamate di sistema, 3 funzioni di libreria, 4 file speciali e device, 6 giochi, 7 varie e convenzioni.

Dentro man ti muovi con less: barra spaziatrice per avanzare, b per tornare indietro, /testo per cercare, n per l’occorrenza successiva, q per uscire.

Quando non ricordi il nome del comando: apropos e whatis

man funziona solo se conosci il nome esatto. Se non lo conosci, cerchi nel database dei manuali con apropos, che confronta la parola chiave con nome e descrizione breve di ogni pagina.

$ apropos kernel
uname (2)            - get name and information about current kernel
urandom (4)          - kernel random number source devices

Il complementare è whatis, che pretende il nome esatto e restituisce la sola riga di descrizione. E qui l’equivalenza da memorizzare, perché all’esame è una tipica risposta da digitare:

$ man -k kernel     # identico ad apropos kernel
$ man -f uname      # identico a whatis uname

Attenzione: entrambi leggono un indice precalcolato, non le pagine. Se rispondono nothing appropriate su una macchina appena installata, l’indice è vuoto o vecchio e va ricostruito da root. Sulle distribuzioni recenti di entrambe le famiglie il comando è mandb; sui vecchi sistemi Red Hat era makewhatis.

Le altre fonti: –help, info e /usr/share/doc

Non tutto sta nel manuale. Quando ti serve solo ricordare un’opzione, l’opzione --help è quasi sempre più rapida, perché è integrata nel binario e non richiede file esterni.

$ uname --help
$ ls --help | grep human

info è il sistema di documentazione del progetto GNU: ipertesto a nodi, si naviga con n (nodo successivo), p (precedente), u (superiore) e q per uscire. Per i comandi delle coreutils — quelli che userai di più — la pagina info è spesso più completa e più aggiornata della pagina man, che ne è talvolta un riassunto.

Infine /usr/share/doc/ contiene README, changelog, file di configurazione di esempio e note della distribuzione, pacchetto per pacchetto. Su un server minimale può succedere che info e persino less non siano installati, mentre man e --help ci sono quasi sempre: se ti capita, non è un guasto, è un’installazione ridotta.

type e which: che cosa esegue davvero la shell

Quando digiti un nome, la shell non cerca subito nel filesystem. Nell’ordine considera alias, funzioni, comandi interni (builtin) e solo alla fine i file eseguibili trovati nel PATH. Il comando che ti mostra questo verdetto è type.

$ type uname cp kill which
uname is hashed (/bin/uname)
cp is /bin/cp
kill is a shell builtin
which is /usr/bin/which

Tre letture importanti. kill è un builtin, cioè fa parte di bash e non esiste come file: per documentarlo non serve man ma help kill. uname risulta hashed perché è stato usato di recente e bash ne ha memorizzato il percorso in una tabella per non ricercarlo ogni volta; hash -d la svuota. E type -a mostra tutte le occorrenze di un nome, utile per scoprire che echo esiste sia come builtin sia come file in /bin/echo — e che quello che parte è il builtin.

which, invece, fa una cosa sola: cerca nelle directory del PATH e stampa il percorso.

$ which uname which
/bin/uname
/usr/bin/which

Proprio perché guarda solo il PATH, which non vede alias, funzioni e builtin: su which kill puoi ottenere /bin/kill, che non è quello che la shell eseguirebbe. Per capire cosa verrà eseguito usa type; per ottenere un percorso da mettere in una riga di comando usa which. Nota infine che su molte distribuzioni recenti /bin è un collegamento a /usr/bin: se il percorso stampato non è quello che ti aspettavi, spesso è solo questo.

Da portarti dietro all’esame

Quattro equivalenze e una distinzione, tutte da sapere nella forma esatta: man -k uguale apropos, man -f uguale whatis, sezione 1 per i comandi e sezione 5 per i formati di file, help per i builtin al posto di man, e type quando la domanda è “che cosa esegue la shell” contro which quando la domanda è “dove sta il file”.