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

  2. 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)
  3. 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.
  4. 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)

  5. 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é ?
  6. 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 ~/..
     
  7. 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.

  8. 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.
  9. 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.
  10. 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.
  11. 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.
  12. 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".

  13. 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).

  14. 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.
  15. 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.

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