Seleziona una pagina

Cos’è il terminale?

Il teminale, anche noto come shell, è l’ambiente di lavoro che permette di impartire comandi al computer. I comandi vengono inviati come stringhe testuali. Il computer risponderà con stringhe testuali o con l’esucuzione di applicazioni grafiche.

Ogni volta che eseguo un programma del mio ambiente desktop o semplicemente esploro le directories con Nautilus, ad un livello più basso vengono eseguiti dei comandi. Possiamo in questo senso immaginare il terminale come uno “strato” interposto fra l’interfaccia utente che utilizziamo quotidianamente e il kernel.

La shell è anche un vero e proprio ambiente di programmazione, oltre che un interprete di comandi, con cui è possibile realizzare script per automatizzare operazioni anche complesse e ripetitive ed è altamente configurabile.

Perchè utilizzare una shell quando posso disporre di interfacce utente che permettono di fare le medesime cose?

Perchè permette di capire meglio come funziona il pc, cosa stiamo facendo e come risponde il sistema ai comandi che impartiamo

  • Perchè vi sono casi in cui l’utilizzo del terminale è l’unico sistema per risolvere eventuali problemi che potrebbero insorgere (es: non viene riconosciuta la scheda video, devo lavorare su una macchina remota, ecc.)
  • Perchè con il terminale si lavora più velocemente. Non ci credete? ….vedremo, chi vincerà la gara che faremo a fine corso 😉
  • Perchè in molti casi usare il terminale è la via più rapida

Tipi di shell

Esistono diversi tipi di shell ognuna delle quali dispone di un proprio set di comandi e di regole sintattiche non sempre simili e compatibili.

L’elenco delle shells disponibili sul proprio sistema è consultabile sul file

/etc/shells

La shell maggiormente utilizzata e predefinita nella maggior parte delle distribuzioni Linux è la BASH, acronimo di Bourne Again SHell. In questo corso ci concentreremo su bash.

 

Apriamo la shell

Dal menu Applicazioni>Accessori di Ubuntu è possibile aprire un terminale. Si tratta di un terminale grafico che è generalmente il più utilizzato.

Ecco come si presenta il terminale una volta aperto:

max@LaPimpa:~$

La riga che compare sul terminale mi fornisce alcune utili informazioni: Chi sono (nell’esempio sopra Max), su quale macchina sono (nell’esempio sopra LaPimpa). Successivamente al simbolo dei due punti mi viene riportato in quale directory del filesystem mi trovo. La tilde (~) indica che mi trovo all’interno della mia home directory, ovvero /home/max. Di seguito al simbolo del dollaro ($) potrò iniziare ad impartire i comandi. In alcuni casi il simbolo del dollaro può essere sostituito dal simbolo del cancelletto (#) ad indicare che abbiamo effettuato il login come root e quindi dobbiamo prestare attenzione.

La struttura dei comandi ricalca normalmente lo schema:

comando [argomenti] [oggetto del comando]

Non tutti i comandi necessitano di argomenti o oggetti. Il comando viene eseguito quando premo il tasto INVIO. Proviamo ad eseguire il seguente comando, premendo al termine INVIO:

echo Hello world

Il comando echo stampa su una riga vuota del terminale tutto quello che segue il comando stesso.

 

Autocompletamento dei comandi

Bash fornisce un utile sistema di autocompletamento ed esplorazione dei comandi. Se scrivo sul terminale una qualunque lettera e successivamente premo 2 volte il tasto tab, mi verrà restituito l’elenco completo dei comandi che iniziano con la lettera che ho premuto. Se scrivo ad esempio “ec” e premo tab, mi verrà scritto automaticamente il comando echo.

I comandi fondamentali

I comandi che dobbiamo conoscere per poter lavorare agevolmente con il terminale non sono molti e sono comunque sempre ben documentati. Sarà tuttavia necessario acquisire dimestichezza con questi semplici comandi. All’inizio di ogni sezione troverai una tabella nella quale saranno riassunti i comandi descritti più approfonditamente nella sezione.

Esploriamo il filesystem

Comandi fondamentali per l’esplorazione del filesystem
Comando Descrizione Opzioni principali o esempi
ls
Restituisce la lista dei file e delle directory contenuti nella posizione in cui il comando viene eseguito -l: restituisce una lista più dettagliata (privilegi di accesso, dimensione data ecc.); -a: Mostra anche il file nascosti
man [comando]
Restituisce il manuale del comando. Es. man ls visualizza il manuale di ls  
cd [nomecartella]
Change directory: permette di cambiare directory. Se mi trovo nella home e digito cd Scrivania mi sposterò all’interno della cartella scrivania. cd ~: va nella home dell’utente; cd ..: va indietro di una direcory; cd –: va nella directory precdedente; cd /tmp: usando il percorso assoluto del filesystem si sposta dentro la cartella /tmp.
mkdir [nomecartella]
Crea una directory.  
cp [fileorigine] [filedestinazione]
Copia un file da una destinazione ad un’altra -r se si vuole copiare una cartella è necessario usare l’opzione -r. E’ possibile usare * per omettere alcune parti del nome (es. cp *jpg /tmp/ copia tutti i jpg nella cartella /tmp).
mv [fileorigine] [filedestinazione]
Sposta un file o una cartella dalla posizione di origine alla posizione di destinazione.  

Nella categoria dei comandi necessari rientrano certamente i comandi di esplorazione e gestione del filesystem, ovvero i comandi che ci permettono di visualizzare il contenuto di una directory, che ci permettono di copiare o spostare file, che ci permettono di creare nuovi file e directory.

Lista dei file e delle directory

max@LaPimpa:~/Desktop$ ls
armandone.png

E’ il comando che restituisce l’elenco dei files e delle cartelle contenuti nella directory in cui ci troviamo, nel caso specifico dell’esempio: ~/Desktop ovvero /home/max/Desktop. Su Ubuntu, con il profilo colore standard, le directories vengono rappresentate in blu, i files in nero, i link simbolici in azzurro e gli eseguibili in verde. Se aggiungiamo l’opzione -la, l’output del comando ls diventa decisamente più interessante:

max@LaPimpa:~/Desktop$ ls -la
drwxr-xr-x  2 mbarbieri mbarbieri   4096 2008-01-10 10:32 .
drwxr-xr-x 27 mbarbieri mbarbieri   4096 2008-04-08 09:07 ..
-rw-r--r--  1 mbarbieri mbarbieri 138379 2007-07-11 12:29 armandone.png

Con il comando ls -la sono presenti le directory . e ..

Il singolo punto rappresenta la directory attuale (in cui ci troviamo), invece la directory con due punti rappresenta la directory madre della directory in cui ci troviamo.

La “d” all’estrema sinistra indica che si tratta di una cartella. I 9 caratteri successivi indicano i privilegi di accesso rispettivamente del proprietario, del gruppo e di tutti gli altri utenti. rwx indica che la cartella è accessibile in lettura (r), scrittura (w) ed esecuzione (x). Procedendo verso destra troviamo il numero dei files contenuti (????), il proprietario, il gruppo di appartenenza, la dimensione, la data e il nome.

Manuale dei comandi

Ciascun comando dispone di un manuale in linea. Il manuale di ciascun comando si consulta scrivendo man [nome comando]. Se ad esempio scrivo:

man ls

otterrò il manuale del comando ls. Per uscire dal manuale basta premere il tasto q.

Muoversi nel filesystem

Per muoversi all’interno dell’albero del filesystem si utilizza il comando cd (Change Directory). La sintassi più comune del comando è cd [cartella di destinazione]. Ad esempio:

max@LaPimpa:~$ cd Desktop
max@LaPimpa:~/Desktop$ 

permette di spostarsi nel desktop. Da notare che il completamento automatico visto per i comandi funziona anche con l’oggetto del comando. Se voglio spostarmi nella directory padre il comando è:

max@LaPimpa:~/Desktop$ cd ..
max@LaPimpa:~$

Il comando cd accetta diverse varianti particolari che in alcuni casi possono essere utili:

  • cd Senza argomenti o oggetti permette di spostarsi all’interno della home directory dell’utente corrente
  • cd [directory] Entra nella directory. Il nome della directory può essere specificato in modo assoluto o relativo. Se ad esempio sono nella mia home directory e voglio entrare nel desktop posso usare il percoso relativo cd Desktop o il percorso assoluto cd /home/max/Desktop
  • cd – Torna nella directory in cui si era precedentemente

Creare una directory

Il comando per creare una directory è mkdir. La sua sintassi è mkdir [nome cartella]. Ad esempio:

max@LaPimpa:~$ mkdir pippo

creerà la cartella pippo all’interno della home directory di max.

Copia di files e cartelle

Per copiare files e cartelle si utilizza il comando cp. La sua sintassi è cp [opzioni] [sorgente] [destinazione]. Vediamo l’esempio seguente.

max@LaPimpa:~/cartoni$ ls
aurora.dsn       cusco.dsn  dreamworks  nemo.dsn    shrek.dmw
cenerentola.dsn  disney     fiona.dmw   paccia.dsn  spirit.dmk

All’interno della cartella cartoni ho due sottocartelle (dreamworks e disney) e 8 files. Voglio copiare i files con estensione .dns nella cartella disney e i files con estensione .dmk nella cartella deamworks.

Abbiamo diverse possibilità di approccio per svolgere il lavoro.

1) Copiamo i files uno alla volta

cp aurora.dsn disney

2) Copiamo i files selezionandoli in base all’estensione utilizzando il simbolo * prima dell’estensione

cp *.dsn disney
cp *.dmw dreamworks

Se vogliamo copiare una intera directory è necessario aggiungere l’opzione -r al comando. Ad esempio:

cp -r disney ../

copia la cartella disney nella directory padre.

Spostare files e cartelle

Per spostare files il comando è mv. La sintassi è analoga a cp. Come nell’esempio precedente, se voglio spostare i files nelle due cartelle in base all’estensione i comandi saranno:

mv *.dsn disney
mv *.dmw dreamworks

E’ possibile usare il comando mv anche per rinominare file o cartelle. Ad esempio, il comando

mv fiona.dmw ciuchino.dmw

rinomina il file fiona.dmw in ciuchino.dmw.

Cancellare cartelle o directory in modo ricorsivo o singoli file

AVVERTENZA: usando il comando rm non sposto le directory o i file nel cestino ma li cancello direttamente.

Per le directory: se necessario coi privilegi di root digito

rm -r nomedellacartelladacancellare

oppure

rm -R nomedellacartelladacancellare

oppure

rm -f nomedellacartelladacancellare
rm -rf nomedellacartelladacancellare

poi premo invio.

ATTENZIONE: gli ultimi due metodi possono essere PERICOLOSI in quanto l’opzione f elimina le eventuali richieste di conferma. In caso di cancellazione errata non resta che tentare di ricorrere al software libero photorec.

Se voglio cancellare un singolo file basta usare in comando rm senza opzioni seguito dal nome del file.

rm nomedelfilecancellare
Manutenzione e amministrazione del sistema

Gestore software (APT)

Nei sistemi Debian derivati uno dei metodi per installare, disinstallere e aggiornare software è quello di utilizzare il comando apt (Advanced Packaging Tool). APT è utilizzabile da riga di comando attraverso la shell oppure attraverso interfaccia grafica (GUI): Debian e Ubuntu utilizzano Synaptic (in Debian si può trovare sotto a Desktop > Amministrazione > Gestore pacchetti Synaptic, in Ubuntu sotto a Sistema > Amministrazione > Gestore pacchetti Synaptic)

La potenza di APT è di poter utilizzare diverse sorgenti contemporaneamente per reperire il software, come risorse remote (http, ftp) e locali (hard disk, cdrom, dvd). Il file di configurazione di queste sorgenti è il file source.list all’interno di /etc/apt/. Per visualizzarlo:

vim /etc/apt/sources.list

(per utilizzare vim leggere la guida sopravvivere con vim)

esempio del contenuto di source.list in Ubuntu 7.10:

# deb cdrom:[Ubuntu 7.10 _Gutsy Gibbon_ - Release i386 (20071016)]/ gutsy main restricted
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://it.archive.ubuntu.com/ubuntu/ gutsy main restricted
deb-src http://it.archive.ubuntu.com/ubuntu/ gutsy main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://it.archive.ubuntu.com/ubuntu/ gutsy-updates main restricted
deb-src http://it.archive.ubuntu.com/ubuntu/ gutsy-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## universe WILL NOT receive any review or updates from the Ubuntu security
## team.
deb http://it.archive.ubuntu.com/ubuntu/ gutsy universe
deb-src http://it.archive.ubuntu.com/ubuntu/ gutsy universe
deb http://it.archive.ubuntu.com/ubuntu/ gutsy-updates universe
deb-src http://it.archive.ubuntu.com/ubuntu/ gutsy-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://it.archive.ubuntu.com/ubuntu/ gutsy multiverse
deb-src http://it.archive.ubuntu.com/ubuntu/ gutsy multiverse
deb http://it.archive.ubuntu.com/ubuntu/ gutsy-updates multiverse
deb-src http://it.archive.ubuntu.com/ubuntu/ gutsy-updates multiverse

## Uncomment the following two lines to add software from the 'backports'
## repository.
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://it.archive.ubuntu.com/ubuntu/ gutsy-backports main restricted universe multiverse
deb-src http://it.archive.ubuntu.com/ubuntu/ gutsy-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository. This software is not part of Ubuntu, but is
## offered by Canonical and the respective vendors as a service to Ubuntu
## users.
deb http://archive.canonical.com/ubuntu gutsy partner
deb-src http://archive.canonical.com/ubuntu gutsy partner

deb http://security.ubuntu.com/ubuntu gutsy-security main restricted
deb-src http://security.ubuntu.com/ubuntu gutsy-security main restricted
deb http://security.ubuntu.com/ubuntu gutsy-security universe
deb-src http://security.ubuntu.com/ubuntu gutsy-security universe
deb http://security.ubuntu.com/ubuntu gutsy-security multiverse
deb-src http://security.ubuntu.com/ubuntu gutsy-security multiverse

#Medibuntu
deb http://packages.medibuntu.org/ gutsy free non-free

deb http://it.archive.ubuntu.com/ubuntu/ gutsy-proposed restricted main multiverse universe

La prima riga rappresenta la risorsa CDROM che è stata disabilitata con # detto anche commento, utilizzato anche nelle righe di informazione che non devono essere interpretate dal sistema ma tralasciate. Le altre righe rappresentano risorse remote supportate o meno dall’Ubuntu team. Tutte queste risorse sono dette anche repository.

apt-get update

Queste risorse (repository) vengono continuamente modificate grazie al costante lavoro della comunità che aggiunge e aggiorna i software presenti. Per aggiornare i repository sul nostro sistema, quindi per avere disponibilità di nuovo software, basta digitare:

apt-get update

apt-get upgrade

Dopo aver lanciato apt-get update per verificare la disponibilità di nuovi aggiornamenti basta digitare:

apt-get upgrade

il sistema restituirà un messaggio con l’elenco dei pacchetti aggiornabili, la dimensione dei file da scaricare, lo spazio da utlizzare sul computer e la possibilità di continuare con l’aggiornamento o meno digitando s o n (si o no).

apt-get dist-upgrade

Può capitare che alcuni pacchetti vengano trattenuti (kept back). Questo significa che esistono nuove versioni di questi pacchetti ma che non saranno installate per qualche ragione. Motivi possibili sono la presenza di dipendenze che non possono essere soddisfatte (uno dei pacchetti da cui dipende non è disponibile per il download) o nuove dipendenze (il pacchetto ha aggiunto una nuova dipendenza nell’ultima versione).

Non c’è una soluzione semplice nel primo caso. Nel secondo caso è sufficiente lanciare apt-get install per il pacchetto in questione e le dipendenze saranno risolte. Una soluzione altrettanto valida è usare:

apt-get dist-upgrade.

L’opzione dist-upgrade viene anche utilizzata per aggiornare l’intero sistema ad una nuova versione.

apt-cache

Da riga di comando per cercare un pacchetto è sufficiente digitare il comando apt-cache in questo modo:

apt-cache search [nome pacchetto]

al posto di [nome pacchetto] inseriremo il nome del software da cercare (o parte del nome o una parola che è presente nella descrizione del pacchetto). Ad esempio:

apt-cache search "cad system"

In Ubuntu l’output restituito sarà:

libqcad0-dev - Qcad development headers and static libraries
qcad - A professional CAD System
qcad-doc - Qcad Documentation
electric - electrical CAD system
sagcad-doc - sagCAD documentation

cioè tutti i pacchetti che hanno nel nome o nella loro descrizione la parola cad e la parola system. (attenzione: senza le “” trovo tutti pacchetti con la parola cad o la parola system).

Per avere informazioni su un determinato pacchetto, come ad esempio la versione e le dipendenze necessarie, basta digirare:

apt-cache showpkg [nome pacchetto]

qui al posto di [nome pacchetto] inseriremo il nome esatto del software che ci interessa cercare.

apt-get install

La procedura per installare un pacchetto da riga di comando è la seguente:

apt-get install [nome pacchetto]

dove al posto di [nome pacchetto] andrà inserito il nome del pacchetto da installare. Se il pacchetto necessita di ulteriore software per soddisfare alcune dipendenze apt restituirà un output con ulteriori indicazioni e la possibilità di continuare o meno.

apt-get remove

La procedura per disinstallare un pacchetto da riga di comando è la seguente:

apt-get remove [nome pacchetto]

dove al posto di [nome pacchetto] andrà inserito il nome del pacchetto da disinstallare.

apt-get clean

Quando si installa un pacchetto, APT recupera tutti i file necessari delle sorgenti specificate in /etc/apt/sources.list e li immagazzina in un archivio locale (/var/cache/apt/archives/) e poi procede con l’installazione. Con il tempo l’archivio locale cresce e può occupare molto spazio sul disco. Con l’opzione:

apt-get clean

vengono eliminati tutti i pacchetti scaricati nell’archivio locale. Se si volesse reinstallare un pacchetto APT dovrà nuovamente scaricarlo.

apt-get autoclean

Con il comando:

apt-get autoclean

si cancellano dall’archivio locale solo i file che non possono più essere scaricati (come ad esempio i pacchetti obsoleti quindi inutili al sistema).

altro…

Provate a digitare:

apt-get moo

Risorse e processi del sistema

TOP

Come possiamo visualizzare i processi e le applicazioni che stanno girando sul nostro sistema? Basta digitare da terminale il comando:

top

In questo modo vengono mostrati i processi che occupano più CPU. Esempio di top:

top - 12:00:00 up  2:37,  3 users,  load average: 0.15, 0.38, 0.45
Tasks: 114 total,   1 running, 113 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.2%us,  0.6%sy,  0.0%ni, 97.1%id,  0.0%wa,  0.1%hi,  0.0%si,  0.0%st
Mem:    766320k total,   677564k used,    88756k free,    34896k buffers
Swap:   995988k total,   211060k used,   784928k free,   284044k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
 5069 root      15   0  267m  58m 6832 S  0.9  7.9   7:47.59 Xorg               
 6260 alle      15   0 64036 9224 7140 S  0.7  1.2   0:03.15 gnome-terminal                  
 6715 alle      15   0  186m  71m  21m S  0.2  9.6   3:16.22 firefox-bin        
 7640 alle      15   0  2364 1156  876 R  0.2  0.2   0:00.06 top                
 4613 haldaemo  15   0  3260 1236 1084 S  0.1  0.2   0:02.83 hald-addon-stor    
 5573 alle      15   0 18544 5180 3728 S  0.1  0.7   0:44.62 compiz.real        
 5582 alle      15   0 20368 5036 4324 S  0.1  0.7   0:12.08 gnome-screensav    
    1 root      18   0  2948 1768  484 S  0.0  0.2   0:02.51 init               
    2 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd       

Nella prima parte il sistema ci offre qualche informazione, come l’ora, gli utenti collegati, i carichi e lo stato dei processi, e l’utilizzo della CPU e delle memorie (RAM e SWAP). Nella seconda parte, in ordine di utilizzo CPU, abbiamo le varie applicazioni che girano in questo momento sul nostro sistema. Per ogni riga, fra le varie informazioni, possiamo distinguere il numero del processo (PID), l’utilizzatore (USER), la percentuale utilizzata di CPU e di memoria, e il nome del programma in questione. Top viene aggiornato in tempo reale ogni 3 secondi, mentre con l’opzione:

top -d n

possiamo modificare il tempo di aggiornamento. (al posto di n metteremo un numero che corrisponde ai secondi voluti).

Con l’opzione

top -U [utente]

si visualizzano solo i processi di un determinato utente (al posto di [utente] scriveremo il nome dell’utente desiderato).

ps aux

Vogliamo vedere se un programma o un servizio sta girando sulla nostra macchina ma occupa troppa poca CPU per essere visualizzato con top? Da terminale digitiamo:

ps aux | grep [applicazione]

Esempio: se digito ps aux | grep cron ricevo come output queste due righe:

root      5215  0.0  0.1   2336   900 ?        Ss   09:23   0:00 /usr/sbin/cron
alle      7774  0.0  0.1   2992   784 pts/1    S+   13:14   0:00 grep cron

la prima è quella che ci interessa, la seconda è la ricerca che si sta effettuando. Cioè la prima riga ci dice che il servizio cron è attivo per l’utente root con PID 5215 e la seconda è la ricerca appena effettuata con ps aux e grep. (Vedere la sezione Pipe).

pstree

I servizi attivi sul sistema possono anche essere visualizzati con il comando pstree che rimanderà un output “ad albero” come nell’esempio:

caronte:/var/www# pstree
init-+-apache2---8*[apache2]
     |-cron
     |-events/0-+-aio/0
     |          |-kblockd/0
     |          |-khelper
     |          |-kmirrord/0
     |          `-2*[pdflush]
     |-6*[getty]
     |-inetd
     |-khubd
     |-kjournald
     |-klogd
     |-kseriod
     |-ksoftirqd/0
     |-kswapd0
     |-lpd
     |-miniserv.pl
     |-mysqld_safe-+-logger
     |             `-mysqld---14*[{mysqld}]
     |-portmap
     |-python
     |-rpc.statd
     |-sendmail-mta
     |-sshd---sshd---sshd---bash---su---bash---pstree
     `-syslogd

è interessante vedere che dal servizio ssh è stato lanciato proprio il comando pstree.

Terminare un processo

Può capire che un programma non si comporti come voluto e che non si riesca a chiuderlo graficamente. Per poterlo chiudere in modo forzato ed essere sicuri che questo sia avvenuto occorre utilizzare il terminale. Mettiamo ad esempio che Firefox non risponda più e non si riesca ad uscire; basta digitare top da riga di comando, visualizzare il numero del processo (PID) e l’utilizzatore (USER)… a questo punto mettiamo che il PID del nostro Firefox sia 6715, digitiamo:

kill 6715

e in questo modo terminiamo l’applicazione. Se non dovesse essere sufficiente aggiungiamo l’opzione -9 per chiudere brutalmente l’applicazione:

kill -9 6715

Se invece vogliamo terminare una serie di processi uguali basta digitare:

killall [applicazione]

al posto di [applicazione] metteremo il nome del programma da terminare. E’ comodo ad esempio quando Firefox ci dice che un’altra istanza è stata lanciata con lo stesso utente e non può essere aperto.

nota importante

kill e killall terminano in modo forzato i programmi quindi occorre controllare se il PID corrisponde al programma che vogliamo veramente chiudere e ricordarci che le modifiche che si stavano facendo non verranno salvate.

Barbatrucchi

Eccoci alla sezione dei “trucchetti”: come fare prima e meglio!

History

Ogni shell ha un file (~/.bash_history) nel quale scrive gli ultimi comandi che abbiamo digitato. Il modo più semplice per navigare nella history è utilizzando la “frecceta su” e la “freccetta giù”.

Esistono altri modi per utilizzare questa storia: ad esempio, se abbiamo digitato un comando molto lungo, possiamo evitare di riscriverlo tutto semplicemente mettendo ! prima del comando:

luca@geronimo:/$ ls -lha
luca@geronimo:~/Desktop$ ls -lha
total 222M
drwxr-xr-x  5 luca luca 4.0K 2008-04-16 16:07 .
drwxr-xr-x 97 luca luca  12K 2008-04-16 16:56 ..
drwxr-xr-x  6 luca luca 4.0K 2008-04-16 12:12 Foto
-rw-r--r--  1 luca luca 127K 2008-01-12 15:56 Grassman.nb
-rw-r--r--  1 luca luca 2.8K 2007-04-22 17:10 isingHB2.m
-rw-r--r--  1 luca luca  11K 2007-11-07 23:13 labteo3(2).nb
-rw-r--r--  1 luca luca 3.7K 2007-11-04 11:25 labteo3.nb
-rw-r--r--  1 luca luca  26K 2007-08-10 16:37 lab-teo-ex2007.pdf
luca@geronimo:~/Desktop$ !ls
ls -lha
total 222M
drwxr-xr-x  5 luca luca 4.0K 2008-04-16 16:07 .
drwxr-xr-x 97 luca luca  12K 2008-04-16 16:56 ..
drwxr-xr-x  6 luca luca 4.0K 2008-04-16 12:12 Foto
-rw-r--r--  1 luca luca 127K 2008-01-12 15:56 Grassman.nb
-rw-r--r--  1 luca luca 2.8K 2007-04-22 17:10 isingHB2.m
-rw-r--r--  1 luca luca  11K 2007-11-07 23:13 labteo3(2).nb
-rw-r--r--  1 luca luca 3.7K 2007-11-04 11:25 labteo3.nb
-rw-r--r--  1 luca luca  26K 2007-08-10 16:37 lab-teo-ex2007.pdf

Elimina cronologia Bash

Da terminale digito:

history -c

poi premo enter o invio.

Non sempre il predetto metodo funziona. Per essere più sicuri è meglio usare

cat /dev/null > ~/.bash_history && history -c && exit

poi premo enter o invio.

Concatenazione di comandi

Quante volte avreste voluto lanciare l’aggiornamento dei pacchetti e poi andarvene via sicuri che al trmine il pc si sarebbe spento da solo??? Ebbene, ora potrete!!

Esistono tre operatori molto importanti: &, &&, ;

  • & manda in background il primo programma, permettendo al secondo di essere eseguito in contemporanea:
geronimo:/home/luca# apt-get update & ls
  • && esegue il secondo programma al termine del primo ma solo se il primo non genera errori:
geronimo:/home/luca# apt-get update && apt-get upgrade
  • ; esegue il secondo programma al termine del primo, anche se ci sono stati degli errori:
geronimo:/home/luca# apt-get update && apt-get upgrade ; halt

Redirezione dell’output

Quante volte vi sarete chiesti come fare per salvare su un file di testo l’elenco di ciò che è contenuto in una cartella…??? O salvare gli insulti che vi sputa il compilatore quando cercate di compilare il kernel? Ebbene, con Linux tutto ciò richiede una riga!

Stream di input e output

Il terminale ha tre stream: l’input (da tastiera) e due output (uno “normale” e uno per gli errori). I due output in generale scrivono sul terminale, ma si può anche decidere di mandarli su un file. Ad esempio, se vogliamo scrivere su un testo tutti i nomi dei file in una directory, ci basta fare

luca@geronimo:/$ ls > elenco.txt

e in elenco.txt troveremo:

luca@geronimo:/$ cat elenco.txt
bin
boot
dev
etc
home
initrd
lib
lost+found
media
mnt
proc
root
sbin
sys
tmp
usr
var

Abbiamo quindi reindirizzato l’output su file!!

Esiste però un altro output, quello per gli errori. Per reindirizare questo stream, dobbiamo fare

luca@geronimo:~$ ls file_non_esistente 2> errors.txt

e in errors.txt troveremmo

luca@geronimo:~$ cat errors.txt 
ls: cannot access file_non_esistente.txt: No such file or directory

Questo può essere utile per tenere traccia degli errori che possono generare alcuni programmi in compilazione (e malauguratamente anche in esecuzione…).

Possiamo anche mandarne uno da una parte e l’altro dall’altra:

luca@geronimo:~$ ls file_non_esistente ./ > elenco.txt 2> error.txt
luca@geronimo:~$ cat elenco.txt 
./:
amsn_received
Books
Desktop
GNUstep
Photos
Pictures
luca@geronimo:~$ cat error.txt 
ls: cannot access file_non_esistente: No such file or directory

Semplice, no?

Pipe

In altri casi, può essere utile riversare l’output di un programma nell’input di un altro. Questo giochetto è implementato in bash con la pipe “|”. Ecco un esempio:

luca@geronimo:~$ lsmod |grep nv
nvidia               7807264  27 
i2c_core               19680  1 nvidia
agpgart                29896  2 nvidia,intel_agp

Nell’esempio il comando lsmod viene riversato come input del comando grep che si occupa di filtrarlo.