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
.