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
  ->



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.



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).
Il segnale per uccidere un processo è SIGKILL ed ha il numero 9.

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
->



Altri comandi utili

Elenchiamo qui altri comandi Linux di grande utilità. Per una loro descrizione più approfondita si faccia riferimento 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/


Esercizi

[01]  Creare un nuovo file GenRubrica.txt nella nuova directory Num_Gen figlia della propria home directory in modo che contenga tutti i dati presenti nelle due rubriche precedenti (Rubrica.txt, MiaRubrica.txt), senza editare manualmente il contenuto dei files.

[02]  Creare un nuovo file OrdRubrica.txt nella home directory memorizzandoci i dati di GenRubrica.txt ordinati secondo l'ordine alfabetico, senza editare manualmente il contenuto dei files.

[03]  Individuare il comando con il quale si sarebbe potuto ottenere direttamente il file OrdRubrica.txt (nella home directory) a partire dai file MiaRubrica.txt e Rubrica.txt.

[04]  Spostare tutti i file con suffisso .txt delle directory Num_Pers e Num_Utili nella home directory e cancellare le directory Num_Pers e Num_Utili.

[05]  Indicare un comando che indichi la size di tutti i file contenuti nella home directory.

[06]  Eseguire la seguente sequenza di azioni:

  • Lanciare da shell l'editor emacs senza il comando &.
  • Indicare la combinazione di tasti che vi permette di sospendere l'esecuzione di emacs in modo da ottenere di nuovo l'uso della shell.
  • Indicare il comando che vi permette di riattivare in background l'esecuzione di emacs.
  • Qual è la differenza tra il comando bg e il comando fg? Se necessario per vedere la differenza ripetere la sequenza di azioni di sopra.

[07]  Scaricare dalla home directory della Prof. Gori (~gorir) il file eseguibile provami. Lanciare l'esecuzione di tale eseguibile (file binario) dando il comando da shell ./provami. Che succede?
Terminare l'esecuzione del programma provami sfruttando un'opportuna combinazione di tasti.

[08]  Eseguire di nuovo il comando ./provami. Aprire un'altra shell e usare una sequenza di comandi per bloccare l'esecuzione del processo provami.
Suggerimento: determinare il PID del processo e poi usare un'opportuna opzione del comando kill.