2.6. Comandi di sistema di base

Non si può iniziare ad addentrarsi all'interno del sistema Unix senza aver fatto prima la conoscenza dei comandi di base disponibili. Ora che si sta utilizzando un account non privilegiato e che non si può danneggiare la propria installazione Debian GNU in nessun modo, faremo un viaggio intorno ai comandi per la manipolazione dei file e delle directory del sistema.

Per cambiare directory, usare il comando cd. Eseguire alcune varianti dello stesso e verificare la directory corrente con pwd o echo $PWD. Si provi a vedere dove porta ciascuno dei seguenti comandi: cd /etc, cd -, cd .., cd $OLDPWD, cd ../.. e cd ˜.

Il carattere tilde (˜) nei nomi di file viene espanso nella directory home dell'utente che invoca il comando. Per l'utente mario, cd ~ e cd /home/mario sarebbero equivalenti. In aggiunta, se mario volesse raggiungere la directory home di dante dovrebbe solo digitare cd ~dante. (Questa capacità di raggiungere la directory home di un utente utilizzando una sintassi indipendente dalle attuali impostazioni del sistema, è un altro dei concetti vincenti di Unix.)

Il trattino (-) e la variabile d'ambiente $OLDPWD fanno la stessa cosa: esse riposizionano alla directory di lavoro precedente. Eseguire il comando più volte fa andare avanti e indietro tra i due percorsi utilizzati più di recente.

Si può controllare il contenuto di una directory con il comando ls (da list, elenca); si provino: ls, ls -al /etc o ls -al / (-a è necessario per permettere a ls di visualizzare i dotfiles, quelli che iniziano con un punto e sono considerati "nascosti", vi ricordate? -l visualizza l'output in formato elenco).

Si creino nuovi file nella propria directory home utilizzando un editor di testo: usare il comando cd per riposizionarsi nella propria directory home e poi avviare, per esempio, nano test. In alternativa, si può usare una variante del comando che non dipende dalla directory di lavoro corrente, per esempio: nano ~/test. Si provi a rimuovere (cancellare) i file creati con rm. Creare directory con mkdir, cancellarle con rm -r o rmdir.

In breve, si noti che gli esempi precedenti utilizzano la propria tastiera come dispositivo di input e il proprio monitor come dispositivo di output. È importante comprendere che Unix può redirigere ogni flusso di dati in posizioni arbitrarie (file, pipe, stampanti, socket di rete e altri). Per esempio, eseguire ls -al / | grep bin. L'output del comando ls -al / sarà inviato con una "pipe" o rediretto al comando successivo, grep, che filtrerà l'input e mostrerà solo le righe che contengono la stringa "bin". Questo uso di "pipe" (un caso speciale di redirezione, nel quale l'output viene deviato ad un programma) è, come si sarà capito, indicato dal carattere pipe ("|").

Se si vuole redirigere l'output di un comando in un file (invece che al comando successivo, come fatto con la pipe precedente), si utilizzino i redirettori > o >>; la differenza è che la coppia >> aggiunge il contenuto in un file senza prima troncarlo (in poche parole cancellarlo). Si provi ls -al / > /tmp/dirlisting.

Alcune volte si può desiderare che l'output appaia sia sullo schermo, sia che venga salvato in un file. Questo è Unix e qui è facile a farsi: ps aux | tee /tmp/ps-aux.listing. Possiamo citare il fatto che, in modo simile, l'output può essere "duplicato" su un'altra console (propria o, in base ai permessi di accesso, su una appartenente a un utente diverso). Per coloro che si domandano come inviare l'output ad una stampante, basti dire che è sufficiente un ps aux | lp una volta che la stampante è configurata.

Alcune altre volte, si ha la necessità di creare un file vuoto. Per esempio, si provi touch test2, > test2 o >> test2. La differenza è che, se il file esiste già, touch ne aggiorna solo la data di modifica, mentre il simbolo di redirezione singolo lo troncherebbe. Alcune persone usano anche echo > test2 ma non si accorgono che il loro file non è esattamente vuoto, bensì che ha dimensione di 1 byte e contiene 1 carattere ASCII che rappresenta una "newline" (questo succede poiché echo aggiunge una newline (un carattere a capo) alla fine, a meno che non venga fornita l'opzione -n).

Adesso si conoscono quattro metodi a riga di comando per creare un file: si provi a testare la conoscenza dei propri amici.

Per salvare una copia della propria sessione interattiva (input ed output utente) in un file chiamato typescript si avvii semplicemente script. Per terminare la trascrizione, si esca dalla shell (per esempio, digitando Ctrl+d su una riga vuota). Come abbiamo detto precedentemente, Ctrl+d è una combinazione standard per "fine dell'input".

Quando si digita ad esempio ls, una istanza del programma /bin/ls diventa un processo (un programma in esecuzione). Ci occuperemo dei processi in maniera esauriente in un capitolo separato ma, per il momento, si sappia solo che il programma avviato ha un ID di processo unico (il PID) che gli viene assegnato, inizia a girare sul processore (la CPU) entra in competizione con gli altri programmi in esecuzione per il tempo processore. Per vedere i propri processi correnti, avviare ps. Per vedere un elenco completo dei processi sul sistema, avviare ps aux. Quando un compito è completo, il corrispondente processo termina, e il numero di PID viene reclamato dal pool (su Linux, la tabella dei processi contiene 32768 voci disponibili). Per una visualizzazione interattiva dei processi, si veda top.

Si verifichino le informazioni sulla memoria di sistema con free. Se si entra nella matematica della memoria totale/libera, tenere però in mente che tanta memoria utilizzata non è una cosa cattiva e non significa che il proprio sistema la stia sprecando; discuteremo di questo più avanti nella Guida.

Programmi aggiuntivi interessanti correlati con il sistema e lo stato della memoria che si possono installare sono sysstat, memstat e htop.

Per vedere un elenco di filesystem montati, il loro punto di mount (montaggio) e le relative opzioni, si avvii mount. Per vedere le statistiche di utilizzo del disco, eseguire df.

Nota

Si noti che mount legge solamente un file, /etc/mtab, e lo "abbellisce" un po' prima di visualizzarlo. /etc/mtab, a sua volta, dovrebbe avere un contenuto che è essenzialmente lo stesso di /proc/mounts, ma ciò non è sempre vero (per esempio, se /etc/ era montata in sola lettura al momento in cui mount voleva aggiornare il file).

A meno che non si sia molto coraggiosi, non capiterà di vedere l'output del comando mount che non è corretto, ma si ricordi che solo /proc/mounts dice la verità definitiva.

Ora, diciamo che si vogliano eseguire i comandi uptime, free e df contemporaneamente. Si potrebbe farlo avviando semplicemente uptime; echo; free; echo; df. (È qui importante il punto e virgola ";", echo senza argomenti serve solamente per produrre righe vuote tra un comando e l'altro).

Si usi w o who per vedere l'elenco degli attuali utenti del sistema. Eseguire last -20 per vedere gli ultimi 20 accessi al sistema. Se si desidera una variante interattiva di w (in stile top), si usi il comando di utilizzo generale watch: watch -n 1 w (terminare premendo Ctrl+c, il generico segnale di "arresto"). watch è piuttosto interessante, utilizzando le virgolette semplici, si può anche avviare watch -n 1 'uptime; echo; free; echo; df'.

Eseguire uname -a per vedere le principali informazioni sul sistema: il tipo e le versioni di hardware e kernel. Per le statistiche attuali, avviare uptime; il programma riporta l'ora attuale, il tempo trascorso dall'avvio (l'uptime della macchina), il numero di utenti che attualmente accedono al sistema e il carico medio (utilizzo del processore) per gli ultimi 1, 5 e 15 minuti.

Per portare l'idea ad un altro livello ancora, diciamo di avere una sequenza complessa di comandi salvati in un file e si voglia eseguire l'intero file in una volta sola (in modalità "batch", come spesso si dice). Questo, naturalmente, si può fare facilmente con il concetto di pipe ricordato sopra. Per prima cosa si esegua echo -e "uptime; echo\nfree; echo\ndf" > comandi per creare il proprio file "batch". (In aggiunta, eseguire cat comandi per vedere quale sia l'aspetto reale del file e per comprendere l'effetto del carattere newline \n). Per "eseguirlo in modalità batch", tutto quello che dovremmo fare è avviare cat comandi | sh, o sh < comandi, o solo sh comandi. In più, se si imposta un bit eseguibile sul file batch (chmod +x comandi) e si aggiunge una appropriata riga di "lancio" (shebang) al file (aprendolo ed inserendovi in cima #!/bin/bash), lo si può avviare invocando ./comandi o, più in generale, /percorso/verso/comandi.

I programmi Unix sono forniti in molte varianti. Abitualmente comprendono un grande insieme di opzioni supportate e interagiscono fruttuosamente uno con l'altro, moltiplicando di fatto l'elenco delle loro funzionalità. Difatti, da qualche parte ho letto un pensiero interessante: che un programma Unix può essere considerato di successo se viene utilizzato in situazioni mai previste dal suo autore. Tutti i programmi che ho menzionato sopra sono cruciali per Unix e sono di successo. Le loro potenzialità complete superano di gran lunga gli esempi di utilizzo di base che abbiamo fornito.