Altri 10 comandi indispensabili

Altri 10 comandi indispensabili

Abbiamo visto in un precedente post 10 comandi indispensabili che ogni utilizzatore di un sistema Unix-like, sia esso Linux, FreeBSD o Mac deve conoscere. Vediamone altri 10.

1. more e less

Abbiamo visto nel precedente articolo che per visualizzare un file contenente testo possiamo usare il comando cat, ma se il file da visualizzare è molto lungo questo scorrerà sul terminale e sarà impossibile da leggere. Possiamo allora usa more per visualizzare il file una pagina alla volta. more è quello che viene definito un pager, ossia un paginatore. Digitiamo ad esempio more /etc/protocols per visualizzare il file dei protocolli tcp/ip: del file viene visualizzato solo l'inizio; per procedere nella visualizzazione si può premere spazio, per avanzare di un'intera pagina, o enter per procedere di una solo riga alla volta. Digitando h o il punto interrogativo ? viene visualizzata la lista di tutti i comandi disponibili. More ha anche una funzione di ricerca attivabile con /, basata sulle regular expressions.

Sebbene more offra molte funzionalità indispensabili per un pager, manca di altre funzionalità più avanzate, per questo il sistema operativo offre come alternativa less un paginatore più evoluto. Digitando less /etc/protocols useremo less per visualizzare il file dei protocolli. Anche con less avremo a disposizione i tasti enter e spazio per avanzare nella visualizzazione, ma less permette anche l'utilizzo delle frecce e dei tasti PagUp e PagDown consentendo un'interazione per molti più naturale. Premendo h si ottiene la pagina di aiuto che rispetto a quella di more offre molte più possibilità.

Non dimentichiamo che in entrambi i casi, quindi sia con more che con less è possibile non solo visualizzare dei file presenti sul sistema, ma anche paginare il risultato di comandi usando la redirezione.

Ad esempio se volessi visualizzare paginato l'elenco dei comandi in /bin potrei fare così:

$ ls /bin | less

2. df

Il comando df visualizza lo stato dei filesystem attualmenti "montati", ossia disponibili al sistema. Ad esempio sul mio laptop in questo momento:

$ df -h
File system     Dim. Usati Dispon. Uso% Montato su
udev            3,8G     0    3,8G   0% /dev
tmpfs           780M  1,7M    779M   1% /run
/dev/sdb1       234G  220G    2,5G  99% /
tmpfs           3,9G   19M    3,8G   1% /dev/shm
tmpfs           5,0M  4,0K    5,0M   1% /run/lock
tmpfs           3,9G     0    3,9G   0% /sys/fs/cgroup
/dev/sda1       219G  187G     21G  91% /stuffs
tmpfs           780M   16K    780M   1% /run/user/1000

L'opzione -h chiede a df di visualizzare i dati numerici in un formato comodo per gli umani (h=>humans) quindi usando kbytes, Megabytes o Gigabytes come unità di misura invece dei Bytes. Per ogni filesystem vengono visualizzati il nome del device, le dimensioni totali, lo spazio usato, la percentuale d'uso e il mount point, cioè il path su cui è disponibile quel filesystem. Nell'esempio i device tmpfs e udev sono in realtà device "virtuali" che servono al sistema come metafora per poter rappresentare un qualcosa che non è realmente un file, come se fosse un file. Ad esempio in /dev vengono creati dei file "fittizi", ognuno dei quali rappresenta in realtà un canale di comunicazione (detto anche device) con una periferica. Ad esempio, solitamemente con /dev/fd viene rappresentato il canale di comunicazione con il floppy disk driver (per quelle poche macchine che lo hanno ancora!). Sempre continuando a esaminare l'esempio qui sopra, vediamo che ci sono in realtà due dischi montati: /dev/sdb1 e /dev/sda1, di questi sdb1 è montato come root filesystem (/) ed è pieno al 99% (devo davvero liberare un po' di spazio!).

3. du

Come abbiamo visto sopra, il mio disco è al 99% e devo decisamente liberare dello spazio, ma come faccio a sapere quali directory ospitano più dati? Per saperlo possiamo usare il comando du, che visualizza, partendo dalla directory corrente, l'occupazione disco di tutte le sottodirectory,
Continuando l'esempio di cui sopra, potrei andare nella root del mio disco e digitare:

$ du -h
4,0K    ./.cache/shutter/unsaved
8,0K    ./.cache/shutter
4,0K    ./.cache/.fr-ikfyBv
300K    ./.cache/docky
60K ./.cache/vlc/art/artistalbum/Buddy Guy feat. Kid Rock/Rhythm
64K ./.cache/vlc/art/artistalbum/Buddy Guy feat. Kid Rock
60K ./.cache/vlc/art/artistalbum/Buddy Guy/Blues
60K ./.cache/vlc/art/artistalbum/Buddy Guy/Rhythm
272K    ./.cache/vlc/art/artistalbum/Buddy Guy/Buddy's Baddest_ The Best Of Buddy Guy
396K    ./.cache/vlc/art/artistalbum/Buddy Guy
[...]

Anche qui ho usato -h per avere un elenco con l'occupazione espressa in maniera da essere più facile da leggere per un umano. Il problema è che in questo modo du renderà l'occupazione di tutte le directory presenti sul disco. Posso limitare la "prodondità" del dettaglio di du usando lo switch -d. Ad esempio con -d 1 mi viene restituito il dettaglio con una profondità 1, ossia di solo le sotto-directory di un livello rispetto all'attuale, cioè di tutte le sottodirecory della posizione corrente:

$ du -h -d 1
2,0G    ./.cache
98M ./.codelite
4,0K ./.hplip
12K ./.aws
16M ./Scrivania
7,7G    ./Musica
399M    ./Immagini
3,9G    ./Documenti
[...]

Da qui si vede bene come sulla mia home abbia circa 7.7 Gigabyte nella directory Musica, 3.9 Gigabyte in Documenti, ecc.

4. uname

Il comando uname stampa alcune interessanti informazioni sul sistema operativo in uso. Ad esempio lanciato senza parametri sul mio laptop Linux Ubuntu ritorna:

$ uname
Linux

Mentre su un server FreeBSD;

$ uname
FreeBSD

uname ha molti switch che ne controllano la visualizzazione di vari dettagli, ma -a li visualizza praticamente tutti:

$ uname -a
Linux maurizio-Vostro-5568 4.13.0-46-generic #51-Ubuntu SMP Tue Jun 12 12:36:29 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

5. uptime

Il comando uptime visualizza l'ora, da quanto tempo il sistema è attivo e il carico di utilizzo medio. Ad esempio sul mio fedele server FreeBSD:

$ uptime
12:04AM  up 66 days, 16:57, 1 users, load averages: 0.33, 0.39, 0.40

6. who

Il comando who ritorna una lista di quali utenti siano collegati al sistema in questo momento e da quale tipo di terminale. Ad esempio in questo momento sul mio server:

$ who
maurizio         pts/0        Aug  9 22:44 (151.15.182.48)

Qui mi dice che l'utente "maurizio" è collegato dal 9 Agosto alle 22:44 dall'ip 151.15.182.48. Su sistemi utilizzati da più utenti collegati contemporanemante la lista può essere molto più lunga.

7. head

A volte possiamo avere la necessità di visualizzare solo l'inizio, le prime righe, di un certo file, In questo caso il comando head è quello che ci serve. Esempio:

$ head /etc/protocols 
# Internet (IP) protocols
#
# Updated from http://www.iana.org/assignments/protocol-numbers and other
# sources.
# New protocols will be added on request if they have been officially
# assigned by IANA and are not historical.
# If you need a huge list of used numbers please install the nmap package.

ip  0   IP      # internet protocol, pseudo protocol number
hopopt  0   HOPOPT      # IPv6 Hop-by-Hop Option [RFC1883]

Come possiamo osservare nell'esempio, di default head visualizza le prime 10 righe di un file. Possiamo cambiare questo numero usando lo switch -n, ad esempio head -n 20 /etc/protocols visualizza le prime 20 righe. Oppure head -c 100 /etc/protocols visualizza i primi 100 caratteri del file.

8. tail

Il comando tail è simile a head solo che visualizza le ultime righe di un file. Anche in questo caso come default tail visualizza le ultime 10 righe ma si può decidere di comunicare un numero di righe diverso attraverso lo switch -n, o specificare un numero di bytes con -c.

$ tail -n 3 /etc/protocols 
shim6   140 Shim6       # Shim6 Protocol [RFC5533]
wesp    141 WESP        # Wrapped Encapsulating Security Payload
rohc    142 ROHC        # Robust Header Compression

tail offre anche un'altra opzione molto utile: con lo switch -f può andare in modalità follow, ossia può tenere aperto un file e visualizzare le eventuali nuove righe che vi verranno inserite. Ad esempio su una macchina Linux potreste usare tail -f /var/log/kern.log per visualizzare le ultime 10 righe del log di sistema, dopodiché, per effetto dello switch -f il comando continuerà a visualizzare le entry nuove entry nel file. Per fare una prova potete provcare nuovi eventi nel kern.log ad esempio inserendo o rimuovendo una periferica USB.

9. echo

Il comando echo invia allo standard output (vedi Redirezione di input e output ) una stringa arbitraria. Esempio:

$ echo "Ciao"
Ciao

Usando l'operatore > o >> è possibile inserire in un file qualsiasi testo vogliamo:

$ echo "Inizio" > file.txt
$ echo "Riga 2" >> file.txt 
$ echo "Riga 3" >> file.txt 
$ cat file.txt 
Inizio
Riga 2
Riga 3

10. which

A volte è utile sapere in quale directory risieda un certo comando: passando uno o più nomi di comandi a which questi ci darà il loro path completo. Ad esempio:

$ which ls tree tar head
/bin/ls
/usr/bin/tree
/bin/tar
/usr/bin/head

Bonus: exit

Per uscire dal terminale basta digitare il comando exit, oppure la sequenza Ctrl+d.

Currently there are no comments, so be the first!