Dr. Giorgio F. Signorini
Università di Firenze
Dipartimento di Chimica
UNIX è un sistema operativo, cioè un ambiente di lavoro su computer, che su un PC svolge un ruolo paragonabile a Windows.
È molto utilizzato in campo tecnico-scientifico, e particolarmente adatto per un uso esperto; ad esempio, per macchine che devono fare da server in WWW (vedi new.netcraft.com http://news.netcraft.com/archives/web_server_survey.html).
A differenza di Windows, UNIX non è un prodotto commerciale. Lo si può considerare come uno standard, o in senso lato un linguaggio. Esitono molti ``dialetti'' UNIX: il più diffuso è GNU/Linux, che funziona sui PC.
Obiettivo di questo modulo è mettere in grado gli studenti di lavorare con UNIX in modo elementare: operare su un terminale ASCII dando semplici comandi per gestire file, creare ed editare file, elaborare file di dati, ed usare semplici applicazioni; e confrontare il modo di operare su terminale con l'uso di un'interfaccia grafica con desktop.
Non ci si propone di insegnare l'installazione e la gestione di un sistema UNIX.
Su UNIX, un libro classico di riferimento è [Kernighan and Pike(1989)]. In rete si trovano innumerevoli libretti e corsi, tra i quali mi paiono utili: [BIU(),4LW(),UHU()].
Chi segue questo corso, avrà a che fare essenzialmente con GNU/Linux. Un ottimo manuale introduttivo è [Ricar(1999)]; più completo è [Petersen(1998)]. [Attivissimo(2000)] è una guida pratica on-line alla migrazione da Windows a GNU/Linux.
Un libro on-line particolarmente esauriente, dedicato oltre che a UNIX a tutto il software libero è [Giacomini()]; esiste anche una versione ridotta a stampa: [Giacomini(2001)].
La distinzione tra software ``libero'' e ``proprietario'' è legata ai diritti di uso e di proprietà:
Notare che secondo la definizione appena data la differenza tra software libero e proprietario non è tanto nel pagamento, quanto nei diritti concessi al destinatario.
Per poter disporre completamente di un software è essenziale conoscerne il funzionamento, senza lati nascosti; bisogna quindi che il testo del programma, o codice originario, sia leggibile (open source).In questo senso i due termini ``libero'' e ``open source'' sono spesso usati come sinonimi. La trasparenza del codice tuttavia, è un requisito necessario ma non sufficiente per poter definire ``libero'' un software.
Secondo la definizione più diffusa, quella della Free Software Foundation[Fre(a),Fre(b)], è "libero" il software che permette a chiunque di:
Per una discussione di questo argomento, vedere il testo di D. Giacomini [Giacomini()] ed anche il documento della Commissione Governativa ([Commissione Governativa sull'Open Source(2003)]), che contiene anche utili definizioni di termini.
Ci sono software che pur essendo gratuiti non sono liberi nel senso definito sopra. Tra gli altri ricordiamo:
Anche se non è necessariamente gratuito, il software libero si può copiare legalmente, e quindi di fatto è meno remunerativo per gli autori.
A questo propostito esiste un dibattito tra due visioni diverse:
È comunque un dato di fatto che:
Il Sistema Operativo è il software essenziale di un calcolatore, cioè quel software senza cui il calcolatore non può essere usato. Più che un programma, è un insieme di programmi di uso generale che
Riportiamo due definizioni di Sistema Operativo.
[da Wikipedia -[Wikipedia(), voce "Sistema Operativo"]] In informatica, un sistema operativo (SO) é il software di sistema responsabile del diretto controllo e gestione dell'hardware che costituisce un computer e delle operazioni di base.
Informalmente, il termine é spesso usato per indicare il software che viene fornito con il computer prima che sia stata installata qualunque applicazione.
Il sistema operativo provvede che le altre applicazioni possano usare la memoria, i dispositivi di input/output e l'accesso al file system. Se molteplici applicazioni sono in esecuzione, il sistema operativo le gestisce in modo che tutte abbiano un tempo sufficiente di accesso al processore.
Esempi di Sistemi Operativi
Classificazione e Terminologia
- Unix
- Linux
- Windows
- MacOS
- Solaris
Un sistema operativo é contettualmente diviso in due componenti, la shell e il kernel. Come il nome implica, la Shell (guscio, conchiglia) è un involucro esterno per il kernel che a sua volta dialoga direttamente con l'hardware.
Hardware <-> Kernel <-> Shell <-> Applicazioni
In alcuni sistemi operativi la shell e il kernel sono entità completamente separate, permettendo di avere diverse combinazioni di shell e kernel (es. Unix), in altri la loro separazione è solo concettuale (es. Windows).
Le ideologie di progettazione del kernel includono il kernel monolitico, il microkernel e l'exokernel. Tra i sistemi commerciali, come Unix e Windows, l'approccio monolitico è predominante, con alcune eccezioni (es. QNX). Il microkernel è più popolare nei sistemi operativi di ricerca. Molti sistemi operativi di tipo embedded usano exokernel ad-hoc.
[Free OnLine Dic Of Computing [FOLDOC(), voce "Operating System"]]:
operating system:
The low-level software which handles the interface to peripheral hardware, schedules tasks, allocates storage, and presents a default interface to the user when no application program is running.
The OS may be split into a kernel which is always present and various system programs which use facilities provided by the kernel to perform higher-level house-keeping tasks, often acting as servers in a client-server relationship.
Some would include a graphical user interface and window system as part of the OS, others would not. The operating system loader, BIOS, or other firmware required at boot time or when installing the operating system would generally not be considered part of the operating system, though this distinction is unclear in the case of a rommable operating system such as RISC OS.
The facilities an operating system provides and its general design philosophy exert an extremely strong influence on programming style and on the technical cultures that grow up around the machines on which it runs.
Example operating systems include 386BSD, AIX, AOS, Amoeba, Angel, Artemis microkernel, BeOS,
Brazil, COS, CP/M, CTSS, Chorus, DACNOS, DOSEXEC 2, GCOS, GEORGE 3, GEOS, ITS, KAOS, Linux,
LynxOS, MPV, MS-DOS, MVS, Mach, Macintosh operating system, MINIX, Multics, Multipop-68, Novell NetWare,
OS-9, OS/2, Pick, Plan 9, QNX, RISC OS, STING, System V, System/360, TOPS-10, TOPS-20, TRUSIX, TWENEX,
TYMCOM-X, Thoth, Unix, VM/CMS, VMS, VRTX, VSTa, VxWorks, WAITS, Windows 3.1, Windows 95,
Windows 98, Windows NT.
Il ruolo e la composizione del S.O. sono meglio compresi in una rappresentazione grafica a livelli. Nel grafico, in alto sta l'utente, in basso il computer. Ogni livello scambia dati solo con quello superiore e quello inferiore.
Notare bene la differenza tra S.O. e programmi applicativi.
Ad es: OpenOffice.org è un programma applicativo che funziona sia
sul S.O. Windows che sul S.O. GNU/Linux.
Altro esempio: si può usare un calcolatore senza MS-Office, ma non senza MS-Windows (se questo è il S.O. installato) |
Tutte queste componenti possono essere realizzate indipendentemente, da soggetti diversi.
Anche se ciò che lo caratterizza è il kernel, spesso si usa il termine ``sistema operativo'' per riferirirsi ad un insieme di kernel, comandi, applicazioni di sistema e interfacce utente:
Il mezzo attraverso cui l'utente interagisce con il computer (ad es., per spostare un file da una directory all'altra o lanciare un programma) è l'interfaccia. Ce ne sono due tipi:
È evidente che l'interfaccia grafica è molto più intuitiva e pratica per eseguire i compiti più semplici. Ma quella testuale ha dei vantaggi.
Si può dire: l'interfaccia testuale sta a quella grafica come il linguaggio parlato (o quello matematico) sta a quello figurato o alla mimica.
Ad es in Windows:
Ad es:
grep Error /var/log/httpd/access.log | wc -lesamina il file di statistiche del server HTTP (/var/log/httpd/access.log) selezionando le righe che contengono la parola ``Error'' (primo comando, fino alla ``|'' ) e poi le conta (secondo comando).
Al confronto, è difficile legare tra loro operazioni compiute graficamente
I sistemi operativi più rudimentali (es. MS-DOS) possono eseguire un solo processo alla volta.
Gli elaboratori centrali (mainframe) hanno invece sempre avuto la necessità di fare funzionare più processi contemporaneamente (ad. esempio, un programma per gestire la posta elettronica e molti accessi contemporanei ad un database).
I sistemi operativi che si trovano sui PC attuali sono tutti, in misura maggiore o minore, multi-processo (multi-tasking): per esempio, si può correggere un documento con un elaboratore di testi mentre si attende la visualizzazione di una pagina WWW.
Si possono definire, sullo stesso sistema, più profili di accesso o utenti. Ciascun utente ha un suo identificativo (account) e quasi sempre una password.
Se il sistema è multi-processo e ci sono più terminali, gli utenti possono lavorare contemporaneamente.
Ogni utente può avere un suo ambiente di lavoro e delle sue prerogative. Tipicamente si distingue tra utenti di basso livello e utenti di alto livello, dove solo questi ultimi possono eseguire funzioni di gestione del sistema (es: aggiornare il software, aggiungere periferiche, etc).
I dati su supporto fisso (disco fisso, dischetti, CD, etc.) sono organizzati in file e directory o cartelle (folder).
Un file è un insieme di dati visti dal sistema operativo come un'unità a sè stante. Ad esempio, un file può essere un documento di testo, un insieme omogeneo di dati, un programma. Il S.O. è in grado di creare e cancellare un file o metterlo a disposizione di un'applicazione. Un file in generale ha
Il disco locale contiene ESRI\AV_GIS30\ARCVIEW\ARCPRESS\ETC\Fonts. La cartella Fonts contiene i file nella finestra di destra: a010013l... |
La directory /home/bidule contiene i file posta e sec.tar e la sottodirectory Desktop |
le stesse informazioni in UNIX si possono ottenere con un semplice comando da terminale:
# ls -l /home/bidule total 544 drwxr-xr-x 3 bidule bidule 4096 Oct 30 2001 Desktop -rw------- 1 bidule bidule 528 Jun 13 15:30 posta -rw-rw-r-- 1 bidule bidule 542720 Sep 23 2002 sec.tar #
Caratteristiche di UNIX rispetto ad altri Sistemi Operativi:
cfr [Attivissimo(2000), capitolo 3]
Ci sono vari ``dialetti'' UNIX, catalogabili in due gruppi:
"UNIX is a registered trademark of The Open Group"però di fatto si è trasformato in uno standard; è proprietà di un'organizzazione più interessata agli standard industriali che alla proprietà intellettuale. Ci sono test passati i quali un S.O. può dirsi legalmente UNIX.
1969 Thompson (Bell Laboratories, NJ, USA)
Principali famiglie di discendenti (anni '80-'90):
SystemV | (AT&T) | commerciale, solida |
BSD | (Università Berkeley) | non-commerciale, dinamica |
BSD deriva da versioni date alle Università per scopi di studio, compreso il codice sorgente. Dal 1993 c'è versione (4.4BSD Lite) ripulita dal codice proprietario AT&T.
Da [Giacomini()]:
I primi utenti di UNIX sono state le università, a cui in particolare questo sistema operativo veniva fornito a costo contenuto, ma senza alcun tipo di supporto tecnico, né alcuna garanzia. Proprio questa assenza di sostegno da parte della casa che lo aveva prodotto, stimolava la cooperazione tra gli utenti competenti, in pratica tra le università.
Il maggior fermento intorno a UNIX si concentrò presso l'università della California a Berkeley, dove a partire dal 1978 si cominciò a distribuire una variante di questo sistema operativo: BSD (Berkeley Software Distribution).
Per difendere il software prodotto in questo modo, nacque una licenza d'uso che rimane il progenitore della filosofia del software libero: la licenza BSD.
Per molto tempo, la variante BSD di UNIX rimase relegata all'ambito universitario o a quello di aziende che avevano acquistato i diritti per utilizzare il codice sorgente dello UNIX originale. Ciò fino a quando si decise di ripulire lo Unix BSD dal codice proprietario.
Il risultato iniziale fu 386BSD, che venne rilasciato nel 1992 con la versione 0.1. [...] si svilupparono altri progetti indipendenti per ottenere, finalmente, un sistema BSD libero. Il primo di questi fu nominato NetBSD, al quale si aggiunse subito dopo FreeBSD; più tardi, apparve anche OpenBSD.
[...]
Allo stato attuale, le tre varianti *BSD sono tutte riconducibili a BSD 4.4-Lite, dove le differenze più importanti riguardano le piattaforme hardware in cui possono essere installate e l'origine della distribuzione. Infatti, il punto di forza della variante OpenBSD, sta nel fatto di essere realizzata in Canada, da dove possono essere distribuiti anche componenti per la comunicazione crittografica.Negli anni '90 dal punto di vista del linguaggio le due famiglie (BSD e SysV) si sono avvicinate.
Linux è un Sistema Operativo della famiglia UNIX nato per funzionare sui PC.
Linux è ``libero'' in quanto distribuito con licenza GPL. Si può copiare legalmente ed è possibile scaricarlo gratuitamente da WWW.
In realtà, Linux è solo il kernel; le altre componenti necessarie per costituire un S. O. completo (comandi, interfacce, etc.) sono software libero, quasi sempre GNU (v. sotto). Perciò è più corretto chiamare il Sistema Operativo ``GNU/Linux''.
L'unione di un kernel Linux con le altre componenti, realizzata da diversi soggetti (aziende o enti), si chiama ``distribuzione'' Linux. Una distribuzione GNU/Linux in generale rispetta gli standard di tipo POSIX con vaste estensioni. Comprende anche software non previsto dagli standard POSIX, tra cui soprattutto:
Esempi di distribuzioni GNU/Linux:
GNU è un insieme di strumenti di software libero (comandi, shell, applicazioni) da usare ``sopra'' un kernel UNIX: GNU/Hurd (Sistema Operativo composto dal kernel Hurd e da GNU), GNU/Linux
È un ``progetto'' creato dalla Free Software Foundation (FSF)
Da [Giacomini()]:
Nel 1985, Richard Stallman ha fondato la FSF, Free Software Foundation, con lo scopo preciso di creare e diffondere la filosofia del «software libero». Libertà intesa come la possibilità data agli utenti di distribuire e modificare il software a seconda delle proprie esigenze e di poter distribuire anche le modifiche fatte.
Queste idee filosofiche si tradussero in pratica nella redazione di un contratto di licenza d'uso, la General Public License, studiato appositamente per proteggere il software libero in modo che non potesse essere accaparrato da chi poi avrebbe potuto impedirne la diffusione libera. Per questo motivo, oggi, il copyright di software protetto in questo modo, viene definito copyleft.
Il software libero richiede delle basi, prima di tutto il sistema operativo. In questo senso, l'obiettivo pratico che si prefiggeva Richard Stallman era quello di realizzare, con l'aiuto di volontari, un sistema operativo completo.
Nacque così il progetto GNU (Gnu's Not Unix), con il quale, dopo la realizzazione di un compilatore C, si volevano costruire una serie di programmi di servizio necessari nel momento in cui il cuore del sistema fosse stato completo.
Il progetto GNU diede vita così a una grande quantità di software utilizzabile sulla maggior parte delle piattaforme Unix, indirizzando implicitamente il software libero nella direzione dei sistemi di questo tipo.
Nel 1990 inizia lo sviluppo del kernel Hurd e intorno al 2000 inizia la distribuzione del sistema GNU/Hurd (sistema GNU basato su kernel Hurd).
NOTA: i comandi che appaiono sottolineati, come less, non sono UNIX, ma estensioni GNU (o altro) che comunque si trovano nella maggior parte delle distribuzioni di GNU/Linux
In UNIX, maiuscole e minuscole sono lettere diverse! Ad esempio il file Mail è un'altra cosa dal file mail, oppure le password
Per lavorare su UNIX bisogna aprire una sessione, cioè qualificarsi come un certo utente riconosciuto dal sistema con certe sue caratteristiche. Alla fine della sessione si scollega l'utente, ma il sistema in generale resta acceso in attesa di nuove sessioni.
Come prima cosa, UNIX chiede di immettere il nome utente e la relativa password. Ad esempio, un terminale può presentare questa scritta:
AIX Version 4 (C) Copyright by IBM and others 1982,1994 login: |
Una volta entrati, ci viene presentato un invito ai comandi (prompt). La nostra riga di comando viene interpretata dalla shell.
Alla fine del lavoro, si termina la sessione su terminale dando exit o logout1
Quasi tutti i sistemi UNIX con cui si ha a che fare attualmente gestiscono una sessione grafica a finestre, all'interno della quale si può aprire una finestra a interfaccia testuale o terminale.
Da una sessione non-grafica si può far partire la sessione grafica con il comando startx o xinit. Si viene immessi in un Desktop con varie applicazioni; talvolta un terminale si apre automaticamente; altrimenti lo si può aprire usando il menù principale (che tipicamente si lancia con un bottone in basso a sinistra dello schermo).
Dal terminale si esce con exit. Per uscire dalla sessione grafica si usa un'opzione del menù principale del desktop, oppure si premono i tasti Ctrl-Alt-Backspace contemporaneamente.
In questo modo si ritorna alla maschera di login. Il sistema è ancora accesso, in attesa di nuovi login. Per spengere il sistema si premono i tasti Ctrl-Alt-Delete contemporaneamente.
Molto spesso la stessa maschera di login è grafica. In questo caso si può scegliere tra varie sessioni grafiche (che differiscono per il Desktop, etc.), nonché una sessione non-grafica (failsafe) da far partire. Dalla maschera di login grafica si può spengere il sistema scegliendo l'opzione Shutdown.
comando [opzioni] [argomento1 argomento2 ...]
date date -u grep Rossi elenco.txt grep -i Rossi elenco.txt tar --help
|
Un comando importante è quello che permette di cambiare la propria password. In generale è
passwdnel nostro caso invece è
yppasswdSi deve immettere la vecchia password, poi la nuova due volte. Usare solo lettere, numeri e caratteri che si trovano su tutte le tastiere.
/home/tizio
finger fa vedere gli utenti collegati, in un modo simile a who; con finger utente si ottengono informazioni su qualunque utente, anche se non collegato
Per avere informazioni sul funzionamento di un comando, spesso si può usare l'opzione -h o -help del comando stesso.
Es:
gzip -h tar --help
Altrimenti si possono usare altri comandi:
man passwd whatis ls apropos calendar info emacs
comando [opzioni] [argomento1 argomento2 ...] | le opzioni cominciano sempre con una o due `` -'' |
comando | note |
exit | per uscire dalla shell e dall'interfaccia testuale |
passwd o yppasswd | per cambiare la propria password |
finger | per vedere chi è collegato |
finger xxx | informazioni sull'utente xxx (anche se non è collegato) |
comando -h | (solo in certi casi) visualizza la sintassi e una guida breve di comando |
comando -help | (solo in certi casi) visualizza la sintassi e una guida breve di comando |
whatis comando | visualizza la definizione di comando |
man comando | guida esauriente su comando (digitare q per uscire) |
apropos parola ... | elenco di comandi che hanno parola nella loro definizione |
info argomento | guida ipertestuale su argomento (digitare q per uscire) |
info | sommario ipertestuale dei vari argomenti visibili con info |
può essere un documento, un insieme di dati in forma binaria, un programma
/u/lx01/signo/did/info-chim/materiali/fs-tree.txtfig
pwdper conoscere il contenuto della directory corrente, dare
ls
cd nuovadirectoryin particolare, per andare alla directory ``genitrice'' (=sopra la corrente, cioè all'indietro verso la radice):
cd ..
In UNIX ogni oggetto (file o directory) può essere sempre identificato in tre modi:
es: se ci si trova sulla directory /home/tizio/, il primo file si chiama
ese/pippo
es: il percorso assoluto per i due file evidenziati è, rispettivamente:
/home/tizio/ese/pippo
/home/infochim/wrk/e3/gigi
Esempio: percorsi del file pippo (cfr. la figura precedente)
se la directory corrente è: | il nome del file è: |
(qualunque) | /home/tizio/ese/pippo |
/home/tizio/ese/ | pippo |
/home/tizio/ | ese/pippo |
/home/tizio/ese/ | ./pippo |
/home/caio | ../tizio/ese/pippo |
se l'utente è: | il nome del file è: |
tizio | ~/ese/pippo |
caio | ~tizio/ese/pippo |
Ci sono dei nomi speciali di directory:
.. | la directory "genitrice" (l'abbiamo già vista nel comando cd) |
. | la directory corrente |
~ | la mia home directory |
~tizio |
la home directory dell'utente tizio |
Notare che
ogni file può avere il permesso di
Permesso | utente | gruppo | altri | ||||||
sì | r | w | x | r | w | x | r | w | x |
no | - | - | - | - | - | - | - | - | - |
Utente e gruppo di appartenenza, e permessi dei file, si possono visualizzare con il comando
ls -l
Es:
-rw-r--r-- 1 infochim chimica 6661 Nov 12 15:30 Mailbox |
significa: leggibile e scrivibile, ma non eseguibile, dall'utente (infochim); solo leggibile dagli appartenti al gruppo (chimica); solo leggibile da tutti gli altri
Notare che la stringa dei permessi contiene 10 caratteri: il primo indica (fra l'altro) se si tratta di una directory, nel qual caso compare una d
Le altre informazioni che vengono stampate con questo comando (le ultime colonne prima del nome del file) sono la data e l'ora di ultima modifica del file.
ls -a
N.B. si possono combinare le opzioni -l e -a, in uno qualunque dei seguenti modi
ls -l -a
ls -a -l
ls -la
ls -al
ls dirdà la lista dei file contenuti nella directory dir.
Note
cd dir
ls
ls .
ls file1 file2 ...
ls -l ~/doc/*.txtdà la lista di tutti i file nella sottodirectory doc della nostra home directory i cui nomi finiscono in .txt.
comando origine ... destinazione
riga di comando | spiegazione | note |
cp file1 file2 | copia file1 in file2 | se file2 esiste già, ci riscrive sopra |
cp file1 dir | copia file1 in dir/file1 | se dir non esiste o non è una directory, copia file1 nel file dir |
cp file1 file2 ... dir | copia file1, file2, ... in dir/file1, dir/file2, ... |
mkdir directory
rmdir directory
per poterla rimuovere, la directory deve essere vuota
cat file
more file
less file
. | la directory corrente |
.. | la directory ``genitrice'' (che contiene la directory corrente) |
~ | la directory di partenza (home directory) di questo utente |
~xxx | la home directory dell'utente xxx |
pwd | visualizza la directory corrente |
cd dir | cambia la directory corrente a dir |
ls | visualizza la lista della directory corrente |
ls -a | visualizza la lista della dir. corr., compresi i file nascosti |
ls -l | visualizza la lista della dir. corr. in formato lungo |
ls [opzioni] dir | visualizza la lista della directory dir |
ls [opzioni] file1 file2 ... | visualizza la lista dei file file1 file2 ... |
cp file1 file2 | copia file1 in file2 |
cp file1 dir | copia file1 in dir/file1 |
cp file1 file2 ... dir | copia file1, file2, ... in dir/file1, dir/file2, ... |
mv file1 file2 | rinomina file1 in file2 |
mv file1 dir | rinomina file1 in dir/file1 (lo muove in dir) |
mv file1 file2 ... dir | muove file1, file2, ... in dir |
rm file1 file2 ... | rimuove (cancella) file1 file2 ... |
mkdir dir | crea la directory dir |
rmdir dir | cancella la directory vuota dir |
cat file | visualizza file |
more file | visualizza file, una schermata alla volta |
less file | visualizza file, con possibilità di scorrere indietro |
pico file
Queste sono proprietà per lo più comuni a tutte le shell
In UNIX, i dati prodotti da un comando sono detti standard output e quelli forniti al comando sono detti standard input. Questi flussi di dati in generale sono associati a due dispositivi, tastiera e video:
standard input | tastiera |
---|---|
standard output | video |
Si possono associare input e output a file con la seguente sintassi
comando ![]() |
esegui comando e dirigi output su file |
comando ![]() |
esegui comando prendendo input da file |
comando1 | comando2 | l'output di comando1 diventa input di comando2 |
comando ![]() ![]() |
aggiungi output di comando in coda a file |
ls stampa la lista della directory corrente ls > a.000 mette il risultato nel file a.000
Possiamo scrivere l'input per bc su un file, bc.dat; ed utilizzare questo come input del comando bc:
$ bc 6.1*2 si digita un'operazione 12.2 risposta del sistema ... ulteriore input <ctrl-D> per uscire dal comando bc $
Altro esempio di reindirizzamento dell'input: il comando wc (con l'opzione -w) conta le parole contenute in un file
$ echo "6.1*2" > bc.dat $ bc < bc.dat 12.2 risposta del sistema $
I comandi ls e wc -w possono essere combinati in una pipeline, senza passare attraverso il file a.000:
wc -w < a.000 conta le parole nel file a.000
Nota: una pipeline può essere costituita da più di due comandi in fila:
ls | wc -w conta le parole nell'output di date
comando1 | comando2 | ...e si può ridirigere l'input del primo comando e l'output dell'ultimo:
comando1 < file1 | comando2 | ... > file
Quando si dà un comando dal prompt, non è possibile dare ulteriori comandi finché questo non è terminato. Dal prompt però si possono però dare due o più comandi per volta:
L'esecuzione in serie può essere applicata ripetutamente.
comando1 ; comando2 Il sistema esegue comando1, aspetta che sia terminato, poi esegue comando2
Esempio:
$ date; sleep -1; date mar dic 9 14:29:03 CET 2003 mar dic 9 14:29:04 CET 2003 $
Anche l'esecuzione in parallelo può essere applicata ripetutamente.
comando1 & comando2 Il sistema esegue comando1 e senza aspettare che sia terminato esegue comando2
Esempio:
$ date & sleep -1 & date ... mar dic 9 14:29:03 CET 2003 mar dic 9 14:29:03 CET 2003 ... $
comando &
Il sistema esegue comando in sottofondo e presenta il prompt per nuovi comandi.
Per vedere tutti i processi, dare il comando ps. Esempio:
$ ps
PID TTY TIME CMD
17686 pts/3 00:00:00 tcsh
18829 pts/3 00:00:00 ps
$ emacs &
[1] 10301Il secondo numero che viene scritto è il numero di processo dell'ultimo processo del job.
Per vedere su terminale la lista di tutti i job, dare il comando jobs
$ find /usr -mtime -7 | sort & [2] 10334 $ jobs [1] + Running emacs [2] - Running find /usr -mtime -7 | sort &
Il comando find /usr -mtime -7 cerca in /usr e nelle sue sottodirectory tutti i file modificati negli ultimi 7 giorni; l'output viene poi filtrato da sort, cioè i file sono ordinati in ordine alfabetico. L'esplorazione del disco in genere richiede un po' di tempo, perciò è utile mandare questa pipeline in background.
Notare che ad ogni comando del job 2 (find e sort) viene assegnato un distinto numero di processo:
$ ps 10284 pts/0 00:00:00 bash 10301 pts/0 00:00:00 emacs 10333 pts/0 00:00:00 find 10334 pts/0 00:00:00 sort 10335 pts/0 00:00:00 ps
kill numero-processooppure
kill %numero-job
Nei nomi di file si possono usare caratteri ``jolly'':
carattere jolly | significato |
* | un qualunque numero di caratteri (anche nessuno) |
? | un solo carattere |
[abc] | un solo carattere tra quelli citati tra parentesi |
Esempi:
*.c | tutti i file che finiscono per .c |
/etc/* | tutti i file della directory /etc |
capitolo?.txt | capitolo1.txt capitolo2.txt ... (ma non capitolo23.txt) |
[ab]* | tutti file che cominciano per a o per b |
La shell verifica quali file corrispondono all'espressione indicata e li sostituisce pedissequamente nella riga di comando, che poi esegue: differenza da DOS!
Esempio: supponiamo che la directory corrente contenga i file
lettera.doc
memo.txt
riassunto.doc
CV.doc
cp *.doc ~/backup-dir
si traduce nel comando
cp lettera.doc riassunto.doc CV.doc ~/backup-dir
che copia i tre file nella directory ~/backup-dir
cp lettera.doc *.txt
diventacp lettera.doc memo.txtche copia il primo file nel secondo, distruggendolo!
NOTA: in DOS, il comando
copy lettera.doc *.txt
significa invece
copy lettera.doc lettera.txt
Oltre a quella sui nomi di file, la shell esegue una serie di sostituzioni sulla riga di comando. Ogni sostituzione è distinta da un carattere speciale.
caratteri | sostituzione eseguita | esempio di comando |
* ? [] | nomi di file | mv capitolo*.txt ../libro |
~ | directory di partenza (home directory) degli utenti | ls ~tizio/tmp |
$ | variabili | echo Terminale definito come $TERM |
! | cronologia (ultimi comandi dati) | !! |
`comando` | output del comando comando | echo "Ci sono `who | wc -l` utenti collegati" |
Quando si vuole usare un carattere speciale senza operare sostituzioni, lo si può proteggere:
$ cd /
$ echo come va?
come var
$ echo come va\?
come va?
$ echo 'questo carattere si chiama tilde:~
'
questo carattere si chiama tilde:~
$ echo questo carattere si chiama tilde:~
questo carattere si chiama tilde: /home/infochim
last | fa vedere tutte le ultime sessioni su questo computer |
last > a.0 | scrive il risultato su a.0 |
less < a.0 | legge il risultato una schermata alla volta |
last | less | combina i due comandi in uno solo |
grep Acciai telefonico.txt | seleziona righe che contengono Acciai |
grep 'Acciai ' telefonico.txt | elimina Acciaioli |
grep 'Acciai ' telefonico.txt > a.0 | mette il risultato su a.0 |
sort -k2 a.0 | ordina le righe di a.0 secondo il nome (seconda parola) |
Lo stesso risultato si ottiene con l'unico comando
grep 'Acciai ' telefonico.txt | sort -k2
zcat -c a.pdb.Z | decomprime il file su standard output |
zcat -c a.pdb.Z > a.pdb | decomprime il file su a.pdb |
grep ' H ' a.pdb > idrogeni | seleziona le righe che contengono atomi di H, e le mette in un nuovo file |
wc -l idrogeni | conta le righe di questo nuovo file |
Lo stesso risultato si ottiene con l'unico comando
zcat -c a.pdb.Z | grep ' H ' | wc -l
odir=OpenOffice.org1.1.0 | inizializza la variabile odir - NB: la sintassi in altre shell è diversa! |
cd $odir | equivale a cd OpenOffice.org1.1.0 |
ypcat passwd > a.pw | visualizza tutti gli utenti definiti sul sistema |
wc -l a.pw | conta le righe di a.pw |
echo ci sono `ypcat passwd | wc -l` utenti | scrive quanti sono gli utenti definiti |
grep :2000: a.pw | seleziona solo gli utenti di chimica (gruppo 2000) |
sort -t: -k3 a.pw | ordina gli utenti secondo il numero utente (terzo campo) |
find ~ -mtime +30 | visualizza tutti i miei file non modificati negli ultimi 30 giorni |
mv `find ~ -mtime +30` /oldfiles/ | li sposta nella directory oldfiles |
comando > file | dirigi output di comando su file |
comando < file | prendi input di comando da file |
comando1 | comando2 | l'output di comando1 diventa input di comando2 (pipeline) |
comando » file | aggiungi output di comando in coda a file |
comando1 ; comando2 | esegui comando1 , aspetta che sia terminato, poi esegui comando2 |
comando1 & comando2 | esegui comando1 , e senza aspettare che sia terminato esegui comando2 |
comando & | esegui comando in background |
Ctrl-C | arresta definitivamente il processo in corso e rende il prompt |
Ctrl-Z | sospende il processo in corso |
fg | ripristina il processo sospeso, in foreground |
bg | ripristina il processo sospeso, in background |
jobs | visualizza lista dei job |
ps | visualizza lista dei processi |
kill %j | arresta definitivamente il job j |
kill p | arresta definitivamente il processo p |
espressione | sostituzione eseguita |
* | nomi file: zero o più caratteri (tranne un . iniziale) |
? | nomi file: un solo carattere (tranne un . iniziale) |
[abc] | nomi file: un solo carattere tra quelli citati tra parentesi (idem) |
~ | directory di partenza (home directory) di questo utente |
~xxx | home directory dell'utente xxx |
$var | valore della variabile var |
!! | ultimo comando dato |
`comando` | risultato del comando comando |
\ | protegge da sostituzione il carattere successivo |
'' | protegge tutto il testo contenuto tra ' e ' |
"" | protegge il testo tra "", tranne $ ` e \ |
Questa lista riporta l'output di whatis comando, in italiano se disponibile
pwd - stampa il nome della directory di lavoro corrente
mkdir - crea directory
rmdir - rimuove directory vuote
chmod - cambia i permessi di accesso di un file
chown - cambia l'utente e il gruppo proprietari dei file
find - cerca i file in una gerarchia di directory
df - visualizza l'ammontare di spazio libero su disco
du - visualizza la quantità usata di spazio su disco
gawk [awk] - linguaggio di ricerca ed elaborazione di configurazioni di testo
(ottimo manuale: ``Using the vi editor'' in [UHU])
Una RE è composta da:
elemento: | corrisponde a: |
c | il carattere (non-speciale) c |
\c | il carattere speciale c, preso letteralmente. Caratteri speciali: .*\[]^$-''' |
. | qualsiasi carattere |
[abc...] | uno qualsiasi dei caratteri abc... |
[v-z] | = [vwxyz] |
[^abc...] | qualsiasi carattere eccetto abc... |
[^v-z] | = [^vwxyz] |
^ | inizio stringa |
$ | fine stringa |
che si possono combinare nel modo seguente:
r1r2 | l'espressione r1 seguita dall'espressione r2 |
r* | l'espressione r ripetuta zero o più volte |
r+ | l'espressione r ripetuta una o più volte |
Esempi:
In generale, una RE corrisponde alla stringa più lunga possibile.
Es:
nella stringa "tanto va la gatta al lardo", la RE /ta.*a/ corrisponde alla sottostringa "tanto va la gatta al la".
Da man awk:
awk [ opzioni ] testo-del-programma file ...
awk [ opzioni ] -f file-di-programma file ...
Esempio:
Ogni volta che awk legge un record lo spezza in campi, usando il valore della variabile FS (espressione regolare) come separatore di campo (default=sequenza di spazi o un tabulatore o un accapo). Se FS è un singolo carattere, i campi sono separati da quel carattere.
Es: il file /etc/passwd ha il formato user:password:userid:groupid:name:home:shell
Si possono definire ed utilizzare delle variabili:
b="ciao"
crf=r*2*3.14
I loro valori sono numeri in virgola mobile, o stringhe, o entrambe le cose, a seconda di come sono usati.
AWK dispone di vettori monodimensionali (i vettori multidimensionali possono essere simulati):
Le istruzioni possono essere assegnamenti o istruzioni condizionali o iterative o di I/O come si trovano nella maggior parte dei linguaggi.
Gli operatori, le strutture di controllo e le istruzioni di input/output ricalcano le corrispondenti del linguaggio C
+ - * / ^ etc.
exit
next
Nel file ~infochim/wrk/esercitaz sono riportati i punteggi ottenuti nelle prime due esercitazioni dai vari studenti del corso. Il file contiene nell'ordine: nome account, turno, punteggio eserc.1, punteggio eserc. 2:
allegra A 2 3
allegri A 0 0
arturoni A 2 5
...
END {print "media= ",s/n}
Un sistema più corretto e sicuro è richiedere che la A si trovi nel secondo campo. In questo caso il pattern deve essere non un'espressione regolare, ma un'espressione relazionale:
plot 'a.0' | usa la prima colonna come x, la seconda come y |
plot 'a.0' using 1:3 | " " " " , la terza come y |
plot [1:10] 'a.0' | nell'intervallo [x=1, x=10] |
plot [1:10][-100:100] 'a.0' | nell'intervallo [x=1, x=10] e [y=-100, y=100] |
plot 'a.0' with lines | formato del diagramma |
plot sin(x) | 100 punti nell'intervallo [x=-10,x=10] |
Per diagrammare i punti sperimentali contenuti nel file ~infochim/wrk/titol
e la curva teorica
tra
e
:
~infochim/wrk
gnuplot
gnuplot> plot [0.01:1] 'titol', 14.+log(x)/log(10.)
Jmol è un programma ``libero'' per la semplice visualizzazione di molecole, cristalli ed altri aggregati atomici. L'input è un file di coordinate atomiche in formato XYZ, PDB, etc.
Si lancia con jmol [file-dati].
Si apre una finestra grafica con la figura della molecola. Attraverso i menu è possibile caricare nuovi file, muovere la molecola, ingrandirla, misurare angoli e distanze, etc.
UNIX fa uso di alcuni caratteri che non sono presenti sulle tastiere italiane. Sui calcolatori dell'aula didattica (aula 40) questi caratteri si ottengono con le seguenti combinazioni:
Per scrivere: | digitare: |
---|---|
~ | AltGr í |
{ | AltGr 7 |
} | AltGr = |
` | AltGr ' |