Ricapitolando...

Abbiamo visto alcuni comandi elementari UNIX per navigare il file system (dirs, pwd, cd, ls), per creare e cancellare file o directory (touch, mkdir, rmdir, rm), e per copiare e spostare file (cp, mv).

Per utilizzare in modo corretto ed efficace la shell, oltre a conoscere i comandi UNIX disponibili bisogna sapere come scriverli e come combinarli, sfruttando alcuni meccanismi che la shell ci mette a disposizione.
Prima di introdurre nuovi comandi, vediamo:

  • Editing della linea di comando
  • Metacaratteri (wildcards)
  • Standard input e output, ridirezione e pipe



Editing della linea di comando

Molte shell offrono funzioni di editing della linea di comando che sono "ereditate" dall'editor emacs.

Ecco alcune delle funzioni più utili:

    Ctrl-e va a fine riga
    Ctrl-a va a inizio riga
    Ctrl-k cancella il resto della linea (kill)
    Ctrl-y reinserisce la stringa cancellata (yank)
    Ctrl-d cancella il carattere sul cursore (delete)
    LEFT/RIGHT ARROW sposta il cursore nella linea
    HOME/END ARROW sposta il cursore all'inizio/fine della linea
    TAB completa il nome del comando o file

La shell, inoltre, registra i comandi inseriti dall'utente nella cosiddetta history. I comandi della history possono essere visualizzati e rieseguiti:

    history elenca i comandi nella history
    UP/DOWN ARROW naviga nella history
    Ctrl-R cerca indietro nella history



I metacaratteri (wildcards)

Accade spesso di voler operare su più file contemporaneamente. Ad esempio, supponiamo di voler copiare tutti i file html di una directory nella sotto-directory html-src. Usando la wildcard  * (asterisco) si può scrivere semplicemente:

-> cp *.html html-src

I metacaratteri e il loro significato sono:

?
qualunque carattere
*
qualunque sequenza di caratteri

Se la shell trova un'espressione contenente metacaratteri in una linea di comando, la espande con tutti i nomi di file che "soddisfano" (match) l'espressione.

I seguenti esempi usano il comando echo, che rimanda sullo schermo ogni parametro.

  -> echo Ciao!
  Ciao!
  -> ls
  data-new data1 data2 inittab pippo pippo2
  -> echo data*
  data-new data1 data2
  -> echo data? 
  data1 data2
  ->



Visualizzare i file di testo

Comandi per visualizzare il contenuto di file di testo
less <file>
more <file>
visualizzano pagina per pagina il contenuto di <file>, che deve essere un file di testo
cat <f1> ... <fn> concatena i file <f1> ... <fn> e ne mostra il contenuto
sort <f1> ... <fn> mostra le righe in <f1> ... <fn> ordinate lessicograficamente

Per visualizzare correttamente file che non sono di testo occorre usare le corrispondenti applicazioni.

Come default, i comandi visti sopra dirigono il contenuto dei file sullo standard output.




Standard input, output e error

Per convenzione ogni programma UNIX comunica seguendo un analogo schema di input/output, che comprende tre canali
  • riceve l'input dallo standard input (stdin)
  • manda l'ouput allo standard output (stdout)
  • segnala gli errori sullo standard error (stderr)

Per default la shell associa stdin alla tastiera e stdout, stderr allo schermo del terminale utente.




Ridirezione

Il meccanismo della ridirezione permette di alterare il comportamento standard.

La shell permette di ridirigere stdin, stdout e stderr, connettendoli a generici file. Si usano per questo i caratteri speciali

>   >>   >&   <

Ad esempio, l'output del comando echo viene mandato su stdout, che per default è lo schermo. Possiamo ridirigere l'output nel seguente modo:

-> echo pippo Topolino
pippo Topolino
echo ristampa sullo schermo il resto della linea
-> echo pippo Topolino > file.txt
-> cat file.txt
pippo Topolino
->
L'output viene scritto nel file file.txt, cancellando il suo contenuto o creandolo se non esiste.
-> echo e anche Minnie >> file.txt
-> cat file.txt
pippo Topolino
e anche Minnie
->
L'output viene appeso al file file.txt.
-> ehco errore > file.txt
csh: ehco: command not found
->
Eventuali errori vengono scritti su stderr, che è ancora associato allo schermo.
-> ehco errore >& file.txt
-> cat file.txt
csh: ehco: command not found
->
Con >& si ridirige anche stderr.

Il comando sort (senza parametri) legge dallo standard input e scrive sullo standard output. Possiamo ridirigere input e/o output così:

-> sort < elenco.txt Stampa sullo schermo le linee di elenco.txt ordinate lessicograficamente.
-> sort < elenco.txt > eleOrd.txt Scrive in eleOrd.txt le linee di elenco.txt, ordinate lessicograficamente.



Pipe

Una pipe prende l'output del comando alla sinistra del simbolo di pipe (la barra verticale, |), e lo manda all'input del comando alla destra del simbolo.

Una pipeline è una sequenza di una o più pipe. Questo meccanismo permette di combinare in modo arbitrario i piccoli ed efficienti comandi UNIX per ottenere nuove funzionalità.

Ad esempio, per vedere il contenuto del file elenco una pagina alla volta dopo averlo ordinato, posso eseguire i comandi:

-> sort elenco > tmp
-> less tmp
-> rm -f tmp

Utilizzando una pipe, ottengo lo stesso risultato risparmiando tempo e spazio disco:

-> sort elenco | less

Introduciamo alcuni utili comandi UNIX, con cui costruiremo altri esempi:

ps -aux
Elenca tutti i processi in esecuzione
grep <pattern> <file>
Elenca le linee di <file> che contengono la stringa <pattern>. Se il file non è indicato, legge dallo standard input.
wc <file>
Stampa numero di linee (-l), di parole (-w) e di caratteri (-c) di <file>.
who
Elenca gli utenti loggati al computer.
-> ps -aux | grep rossi
Mostra la lista dei processi dell'utente rossi
-> who | wc -l
Stampa il numero di utenti loggati al computer



Personalizzazione con alias

Quando si lancia la shell bash (il default dei vostri account) vengono eseguiti i comandi contenuti nel file .bashrc nella home directory.

Questi comandi possono essere usati per personalizzare il comportamento della shell, ad esempio con

  • dichiarazione di alias

I comandi alias e unalias permettono di definire ed eliminare alias, ovvero nomi che rappresentano comandi, possibilmente composti e con opzioni.

 alias rm='rm -i'
 alias lsss='ls -l * | less'
I comandi rm e lsss vengono espansi dalla shell come indicato.
 unalias lsss
Annulla l'alias.
 alias
Elenca gli alias attivi.

Attenzione al tipo di shell
La sintassi e le funzionalità di alcuni comandi possono variare a seconda della shell che state usando. Un esempio notevole è dato proprio dal comando alias, la cui sintassi nella shell csh diventa

alias rm rm -i




I processi

Un processo è un programma in esecuzione. Concettualmente, la shell esegue ripetutamente i seguenti passi:
  • stampa il prompt e attende l'input dell'utente;
  • legge la linea di comando;
  • espande eventuali alias e wildcard;
  • se il comando è un comando interno lo esegue, altrimenti:
    • individua il comando da eseguire nel file system;
    • lancia un processo per eseguirlo mettendosi in attesa;
  • quando l'esecuzione del comando termina, riprende l'esecuzione.

Poiché UNIX è un sistema multitasking, la shell permette di lanciare più processi in parallelo. Scrivendo

-> <comando> &

il comando <comando> viene eseguito in background, cioè la shell continua l'esecuzione subito dopo aver lanciato il processo, senza attenderne la terminazione.

I seguenti comandi e tasti speciali sono utili per la gestione dei processi:

jobs elenca i job della shell corrente, con il numero di job; quello marcato con + è il job corrente
fg
fg %
<n>
riporta in foreground il job corrente
riporta in foreground il job numero <n>
Ctrl-z combinazione di tasti che sospende il comando in esecuzione
bg %<n> riattiva in background l'esecuzione del job <n> (di quello corrente se senza argomenti)
Ctrl-c Combinazione di tasti che termina il comando in esecuzione
ps
ps -aux
elenca i processi (e pid) della shell corrente
elenca tutti i processi in esecuzione
kill -s <n>   <p>
kill -s <n>   %<j>
kill -l
invia il segnale <n> al processo con PID <p>
invia il segnale <n> al job <j>
elenca i segnali possibili (es. KILL)

Ad esempio, per lanciare emacs in background, le seguenti sequenze sono equivalenti:

-> emacs nome-file-da-editare &
->
-> emacs nome-file-da-editare
Ctrl-z

-> bg
->



Cercare comandi e file

UNIX fornisce vari comandi per cercare comandi o file, oppure per ottenere informazioni su di un comando o file dato.

which <comando> fornisce il pathname completo o l'alias di <comando>
whereis <comando> cerca sorgenti, eseguibile e documentazione di <comando> nel file system
find <path> <expression> cerca ricorsivamente i files nella directory specificata usando vari criteri
locate <pattern> elenca i file di un database globale che soddisfano il <pattern>.
apropos <keyword> elenca i comandi la cui descrizione contiene <keyword>.
man <comando> Mostra il manuale on-line di <comando>.



Altri comandi utili

Elenchiamo qui altri comandi Linux di grande utilità. Per una loro descrizione più approfondita si faccia riferimento alla dispensa CdC & Linux oppure alla documentazione online di Linux, provando i seguenti:
<comando> --help
man <comando>
info <comando>.

quota mostra lo spazio disco che si ha a disposizione e l'occupazione attuale
Attenzione: con quota esaurita il login con GUI non funziona: usare Ctrl-Alt-F1 per login testuale e controllare la cache del browser.
gzip/gunzip compressione/decompressione di file
bzip2/bunzip2 compressione/decompressione di file
tar creazione di/estrazione da archivio, normalmente con compressione/decompressione
zip/unzip
rar/unrar
creazione di/estrazione da archivio, normalmente con compressione/decompressione
file <nome> mostra il tipo del file <nome>

Ad esempio, per creare l'archivio compresso di un progetto si può usare tar:

-> tar -zcvf arch.tgz projdir/

Per estrarre i file archiviati:

-> tar -zxvf arch.tgz