Laboratorio di Programmazione.
AA 2004/05.
Esercitazione n. 1
Scopo di questa esercitazione è di familiarizzarsi con i
principali comandi per l' interprete di comandi (shell), con le
manipolazioni di base di files e directories in ambiente UNIX, con la
scrittura
di file di testo e semplici manipolazioni ed elaborazioni degli stessi
fattibili mediante comandi della shell.
N.B. evidentemente, i comandi per l' interprete di comandi
presuppongono di lavorare in ambiente UNIX nativo o in emulazione.
Lavorando su un sistema Unix con interfaccia grafica ci sarà
sempre il modo di aprire una "finestra terminale". I nomi possono
essere
diversi (xterm, dtterm, vxt, shell, ....) e le icone in genere mostrano
un'
immagine stilizzata di schermo a raggi catodici oppure, con
interfacce come WindowMaker, e' necessario usare il tasto
destro del mouse per visualizzare un menu' a scomparsa che permette
di lanciare l' applicazione (selezionare tools).
Dalla finestra terminale e' possibile "dialogare" con l' interprete di
comandi
di linea.
Di interpreti di comandi (shell di login) ce ne possono essere molti
(bash,
sh,csh, ksh, tcsh, zsh, ...) che pero', in genere, differiscono poco.
Un po'
come
dialetti della stessa lingua.
In genere l ' interprete di comandi segnala di essere in attesa di un
comando
visualizzando sullo schermo una scritta (il prompt) dopo la quale
appare
qualsiasi carattere venga digitato sulla tastiera.
Anche il prompt varia da sistema a sistema e da utente a utente (e'
completamente
riconfigurabile dall' utente).
Se dopo aver digitato una o piu' parole si preme il tasto invio (enter
o
return sulle tastiere inglesi) l' interprete di comandi interpreta la
prima
parola come il nome di un file contenete istruzioni per un interprete
di
comandi (lo stesso o un altro) oppure un file contente codice binario
in
linguaggio macchina (binario eseguibile).
L' interprete cerca all' interno di un insieme di directories
(cartelle)
predefinita (ma modificabile) un file eseguibile con quel nome. Se lo
trova
cerca di eseguirne il contenuto. Altrimenti segnala che non trova il
comando.
Quando ci si collega la directory corrente (ovvero di default) e'
costituita
dalla cosiddetta home directory stabilita una volta per tutte
dall'
amministratore di sistema. La home directory ha in genere lo stesso
nome
dello username.
Qual è la directory corrente ?
Per scoprire qual' e' la propria home directory basta dare (subito
dopo
aver aperto la finestra terminale) il comando
prompt> pwd
Quali file ci sono ?
Il comando ls elenca il contenuto della home
direcory.
prompt> ls
Se nella directory non c'e' alcun file visibile si riottiene il
prompt.
Alternativamente puo' già essere presente qualche file.
il comando ls non visualizza tutti i file di
una
directory ma solo quelli il cui nome NON inizia con un punto
(.).
I file il cui nome inizia col punto (.) sono chiamati file
nascosti
ed usualmente contengono informazioni utili alla configurazione di
programmi
o alla personalizzazione dell' ambiente di lavoro. Il motivo per
"nasconderli"
e' di non ingombrare eccessivamente di nomi l' elenco dei files e
directories
e di rendere meno probabile una cancellazione involontaria degli stessi
da
parte dell' utente.
Per elencare tutti i files, inclusi quelli nascosti, si puo' usare
il
comando:
prompt> ls -a
ls e' un esempio di un comando chhe puo' essere modificato da
opzioni:-a e' un esempio di opzione. Le opzioni modificano il
comportamento
del comando (cfr. la differenza tra ls e ls
-a).
Le opzioni vanno separate tra loro e dal nome del comando mediante uno
o
piu' spazi. Esistono informazioni on-line su quali opzioni sono
disponibili
per un particolare commando e come ogni opzione
modifica
il comportamento del comando. Provare con man ls
- Creiamo una sotto directory nella home directory per metterci
i files che saranno generati nel corso di questa sessione.
Per creare una sottodirectory di nome dir_uno
nella directory
corrente, occorre scoprire come fare a creare una nuova directory.
Un modo per ottenere informazioni direttamente dal sistema è di
usare il comando apropos keyword dove keyword è
una parola chiave che possa avere attinenza col compito da svolgere.
Nel nostro caso si potrebbe provare "create" oppure "directory". E, per
vedere la directory appena creata, dare il comando:
prompt> ls
- Si può trasformare la nuova directory in quella di
default col comando cd:
prompt> cd dir_uno
Immetere ls per vederne il contenuto
(che
dovrebbe essere vuoto)
- Creare un' altra directory di nome projects
all'
interno di dir_uno e dare il comando ls -a.
prompt> ls -a
Come si puo' vedere, nella directory dir_uno
(e in tutte le directories) ci sono due directories speciali di
nome
"." e ".."
In UNIX, "." indica sempre il nome della directory
corrente.
".." indica il genitore della directory corrente. Quindi
il comando
cd ..
ci porterà una directory piu' in su nella gerarchia (nel
presente
esempio, nella home directory). Provare.
Note: battere cd senza argomenti fa
sempre
tornare nella home directory. Questo e' un modo semplice per evitare di
"perdersi" nel
filesystem.
(Ricordare: se vi smarrite, il comando cd
(da solo) fa tornare alla home directory)
- Andate nella home directory e digitate:
prompt> ls dir_uno
poi date il comando
prompt> ls projects
otterete un messaggio del tipo:
projects: No such file or directory
Perché ?
- Si puo' sempre fare riferimento alla home directory
mediante il simbolo
$HOME . Puo' essere usato per specificare nomi completi
(assoluti) che
partono dalla home directory. Cosi', per esempio,
prompt> ls $HOME/dir_uno
elencherà il contenuto di dir_uno
indipendentemente da
quale e' la directory di default corrente. Spesso gli interpreti di
comandi
permettono di usare il segno di tilde (~) come equivalente a $HOME.
Prevedete cosa elencherà allora il comando
prompt> ls ~/..
- Il comando nedit permette di lanciare un' applicazione
corrispondente ad un editor di testi (analogo al notepad di windows).
Lanciare nedit e scrivere un testo nella fiestra che
apparirà sullo schermo.
Quindi salvare quanto scritto in un file.
Provare a dare il comando ls per verificare l' esistenza
del nuovo file.
Ci sono problemi ? Uscire prima dall' applicazione nedit.
- Usare apropos per trovare il comando che permette di
copiare un file su un altro. Utilizzare questo comando per creare una
copia con nome diverso del file precedentemente creato.
- Il comando rm cancella (rimuove) un
file.
Cancellare il file appena copiato e verificare la cancellazioe col
comando ls.
Se non vogliamo correre il rischi di cancellare inavvertitamente
un
fie importante si puo' usare l' opzione -i nel comando rm.
Provare.
Provare anche a cancellare una directory.
- Possiamo cambiare il nome ad un file. Trovare il comando
corrispondente
con "apropos" e cambiare il nome ad un file e/o ad una directory.
- Per visualizzare (ma senza possibilità di apportare
modifiche)
file di testo si possono usare i comandi more o less
che hanno comportamenti lievemente diversi ma permettono sempre di
visualizzare files, anche lunghi, una pagina alla volta (si va avanti
premendo la barra spaziatrice e si esce premendo il tasto q).
Provare.
- Non tutti i file sono leggibili sullo schermo. I files
corrispondenti
ad applicazioni (contenenti istruzioni macchina) non sono leggibili
direttamente su schermo perché contengono molte sequenze che non
hanno significato per i programmi che convertono i byte in caratteri o
(peggio) corrispondono a sequenze di controllo che modificano il
comportamento della finestra che si sta utilizzando.
Provare a visualizzare i files contenuti nella directory /home/pastore.
Cominciando dal file "file_testo".
- Il carattere * e' detto un carattere jolly
(wildcharacter), e sta per
nessuno o piu' caratteri se presente nel nome di un file o directory.
Per
esempio, se nella directory /home/pastore si digita ls *.doc
cosa si vedrà ?
Si puo' anche usare una o più occorrenze del carattere ?
che corrisponde ad esattamente uno ed un solo carattere
(qualsiasi).
- Un processo e' qualsiasi programma che e' stato caricato dal
sistema operativo per andare in esecuzione, identificato
da un numero (PID: Process IDentifier) univoco. Per visualizzare
informazione
sui processi dell' utente, incluso il loro PID e tempo complessivo di
eecuzione sul processore, dare in comando:
prompt> ps
Per mettere in background un processo aggiungere un &
alla fine
della linea di comando. Per esempio il comando sleep attende un dato
numero
di secondi prima di continuare. Provare con
prompt> sleep 10
Il processo attendenderà 10 secondi prima di ridare il
prompt. Finche'
non torna il prompt, non si puo' far nulla.
Per eseguire in background:
prompt> sleep 10 &
[1] 6259
Il & esegue in background permettendo di lanciare piu' jobs
mentre
si attende che altri programmi finiscano. La prima linea dell'
esempio
precedente e' data dall' utente; la linea successiva, indicante
il numero
di un job ed il corrispondente PID, proviene dalla macchina. Un altro
esempio
e' di dare il comando xterm oppure xclock.
- Si possono avere informazioni sui processi attivi sul sistema
(anche di
altri utenti), oltre che col comando ps -elf (e ulteriori
variazioni, cfr. man pages per ps) anche col comando top che
permette di avere informazioni e modificare i parametri dei processi
interattivamente (per terminare
premere il tasto q). Provare.
Top dà anche alcune informazioni sul sistema.
- Gli interpreti di comandi UNIX mettono a disposizione numerosi
comandi predefiniti (comandi di sistema) in grado di svolgere molti
compiti frequenti.
Cercare sulle pagine di manuale (man pages , comando man )
la descrizione dei comandi:
wc, sort, uniq, grep, date, bc, lpr, ispell, who, finger.
Per l' approfondimento
personale.
In rete sono reperibili moltissimi tutorial e
documentazione per l'utilizzo delle shell. Un buon punto di
partenza per padroneggiare le tecniche di base e'data dalle
pagine su
UNIX
tutorial for beginners (by M.Stonebank). Si consiglia
di dedicare una ventina di minuti a ciascun blocco, avendo
davanti un computer su cui verificare e provare le informazioni.