3. PERCHE' UN CORSO SULLA
BASH?!?
La risposta è semplice, avete mai provato a
digitare sulla console del vostro sistema UNIX:
:/> man bash
4.
5. Quasi 4000 righe di manuale tecnico senza
esempi... insomma come posso muovermi fra
tante informazioni e arrivare il prima possibile a
quello che mi serve per la soluzione del mio
problema?
6. PRIMO GIORNO
● Le Shell di UNIX: similitudini, differenze e
compatibilità
● Funzionalità interattive della shell Bash
● Lancio di una procedura Bash
● Variabili Locali e d'Ambiente
7. Che cosa è una Shell?
●Breve definizione
●Storia
●Struttura (Concetto di Software a Livelli)
8. DEFINIZIONE: SHELL
● In genere di cosa si parla quando si accenna
alla shell?
– La Shell genericamente identifica la “linea di
comando” del Sistema Operativo.
– La shell è contemporanea allo Unix
– E' un interprete di comandi
– E' un linguaggio di programmazione interpretato
9. DEFINIZIONE: SHELL
● Diamogli una definizione meno granulare e
confusionaria:
– Il nome SHELL deriva dal tipo di compito che ha
questo programma; come una conchiglia bivalve
protegge il mollusco al suo interno, così la shell
“ricopre” il nucleo o Kernel del sistema operativo
per nascondere i dettagli e rendere disponibili le
funzionalità evolute in maniera che l'user (utente)
non debba preoccuparsi di come realizzarle.
13. DEFINIZIONE: SHELL
– La SHELL quindi è l'interfaccia tra il sistema
Operativo e l'utente. Interpreta i comandi inseriti a
terminale o raccolti in un file (Script), li mette in
esecuzione.
● Ma come mai si è avuta la necessità di creare
un programma simile?
– I processori comandi realizzano una “interfaccia
veloce” fra l'utente e il sistema operativo, senza
necessariamente vincolare chi ne fa uso ad un
lungo apprendimento di uno specifico linguaggio di
programmazione.
14. DEFINIZIONE: SHELL
In conclusione la shell è un interprete o
processore di comandi che mette a disposizione
svariate funzioni di programmazione e non.
Esegue in maniera veloce comandi inseriti da
parte dell'utente stesso.
Non necessita obbligatoriamente della
conoscenza di un linguaggio di programmazione
per utilizzare le sue funzioni principali
15. COMPORTAMENTO DI UNA
SHELL
Lo schema base di funzionamento può essere
riassunto così:
Loop forever
<accetta comando da console>
<esegui comando>
end Loop
16. COMPORTAMENTO DI UNA
SHELL
Se il sistema su cui viene eseguita ha prevede
l'autenticazione per l'accesso:
Loop forever
<LOGIN>
repeat
<accetta comando da console>
<esegui comando>
until <fine file>
<LOGOUT>
end Loop
18. LE SHELL UNIX
● Un po' di storia sulle shell UNIX
– La prima shell UNIX fu' la Thompson Shell (sh),
creata da Ken Thompson nel laboratori della Bell.
Venne distribuita dalla versione 1 alla 6 di Unix, dal
1971 al 1975. E' considerata veramente
rudimentale per gli standard moderni di produzione.
– La seconda shell Unix è stata la PWB Shell o
Mashey shell, una diramazione (fork) della shell di
Thompson distribuita con lo “UNIX
PROGRAMMER'S WORKBENCH” nel 1976
19. LE SHELL UNIX
Nel tempo sono state create una serie di shell di
tipo diverso.
Siccome ogni Shell non è altro che un programma
eseguibile che realizza il supporto per la
invocazione dei comandi, è possibile passare da
una shell di UNIX ad un'altra tramite invocazione
diretta.
20. LE SHELL UNIX
A differenza di particolari sistemi operativi dove si
è vincolati ad una sola shell nei sistemi Linux è
possibile scegliere quale shell utilizzare a
seconda della propria esperienza e delle proprie
necessità .
Le shell presenti nel nostro sistema sono elencate
nel file '/etc/shells'
21. LE SHELL UNIX
● Le principali shell UNIX presenti sono le
seguenti:
– csh (C-Shell) e tcsh (Tenex C-Shell)
– ksh (Korn Shell) e zsh (Z-Shell) e bash (Bourne
Again Shell)
22. LE SHELL UNIX [csh]
● La csh ha le seguenti caratteristiche:
– Job Control: è la proprietà di sospendere e
ripristinare in modo interattivo un Job (processo), e
anche di mandarlo in esecuzione in background.
– History substitution: è la caratteristica di permettere
ai comandi precedenti di poter essere rieseguiti o
editati in vari modi.
– Array: gestisce variabili contenenti elementi multipli
che possono essere indicizzati numericamente.
– ~: introduce l'operatore tilde per indicare la directory
home dell'utente.
23. LE SHELL UNIX [csh]
– Alias: è la proprietà di assegnare un nome ad un
comando o ad una sequenza di comandi.
– Operazioni Matematiche: permette di eseguire
operazioni matematiche semplici in shell senza
utilizzare programmi esterni.
DIFFERENZE RISPETTO A BASH
– Incompatibilità di sintassi.
– Effetti impredicibili degli errori di sintassi.
24. LE SHELL UNIX [tcsh]
● La tcsh ha le seguenti caratteristiche:
– Compatibilità completa con csh.
– File completion
– Command line Editing
– La sintassi del linguaggio scripting è C-Like come in
csh.
DIFFERENZE RISPETTO A BASH
– La programmazione in tcsh è considerata
difficoltosa.
25. LE SHELL UNIX [ksh]
● La ksh ha le seguenti caratteristiche:
– La sua sintassi è molto simile ad un linguaggio di
programmazione.
– ksh supporta gli Array Associativi e operazioni in
virgola mobile
– La ksh è stata a pagamento fino al 2000, questo ne
ha limitato moltissimo l'utilizzo e la diffusione.
N.B. Alcuni linguaggi ammettono indici di tipo non
numerico, per esempio stringhe. Si parla in questo
caso di hash table, o di array associativo, perché
ogni valore stringa utilizzato come indice viene
associato a un valore dell'array.
26. LE SHELL UNIX [zsh]
● La zsh viene considerata una extended bash,
perché contiene le caratteristiche più utili di
bash, ksh e tcsh. Le sue caratteristiche salienti
sono:
– La completion della stringa di comando è
completamente configurabile dall'utente.
– L'History dei comandi può essere condivisa fra tutte
le shell in esecuzione.
– Extended file globbing permette la specifica dei file
senza avere bisogno ricorrere a programmi esterni
tipo find.
27. LE SHELL UNIX [zsh]
– E' migliorata la maneggiabilità di array e vettori.
– Si possono editare comandi multi linea in un solo
buffer.
– Permette la correzione automatica degli errori di
ortografia.
– Diversi modi di emulazione possibili (es. può essere
avviato come se fosse un Bourne Shell).
– Prompt configurabile, è possibile inserire
informazioni sul lato destro dello schermo che si
auto-nascondono quando si sta scrivendo a lungo.
– Completamente configurabile.
28. LE SHELL UNIX [zsh]
Come è ovvio essendo una shell ricca di
caratteristiche, è di conseguenza anche molto
voluminosa, e questo ne ha ridotto la diffusione in
vari ambiti.
La seguente citazione è ripresa da WikiPedia:
“Attesting to the sheer size of this shell is the now
famous first sentence of the shell's manual page,
which reads "Because zsh contains many
features, the zsh manual has been split into a
number of sections", and then goes on to list
thirteen items”
29. LE SHELL UNIX [bash]
● La bash nasce dal progetto GNU, è la shell di
default sulla maggior parte delle distribuzioni
Linux in commercio. La shell bash ha le
seguenti caratteristiche::
– La sintassi dei comandi è un super-set della Bourne
Shell. (Piena Compatibilità)
– La sintassi dei comandi include caratteristiche
presenti nella ksh, csh come:
● la Command line Editing, la Command History, la
Directory Stack, le variabili $RANDOM e $PPID, e la
proprietà dello standard POSIX per la sostituzione dei
sintassi dei comandi: $(...)
30. LE SHELL UNIX [bash]
– Quando viene utilizzata in modalità interattiva, la
pressione del tasto TAB attiva il completamento
automatico dei nomi parzialmente digitati di
programmi, nomi di file, nomi di variabili etc. etc.
– Si possono eseguire operazioni su numeri interi
– Ha una gestione semplificata della ridirezione
dell'I/O rispetto alla Bourne Shell (command &> file
è equivalente a command > file 2>&1)
31. LE SHELL UNIX [CONCLUSIONI]
Si può capire, volendo tracciare una direttrice
comune a tutte le shell, che esse condividono
alcuni concetti:
● Sono tutte distinte dal kernel e vengono
eseguite come programmi utente.
● Ognuna può essere personalizzata
attraverso la modifica dei file di
configurazione del proprio ambiente
operativo.
● Le Shell possono venire eseguite sia in modo
interattivo tramite gli utenti sia in modo non
interattivo tramite chiamate al sistema
operativo.
32. LA BASH SHELL
Come è stato evidenziato prima la bash, prima di
mettere in esecuzione un comando, può operare
delle trasformazioni sullo stesso: espansione dei
metacaratteri, la ridirezione e il piping, la ricerca
del comando da eseguire nei direttori secondo un
certo ordine e la esecuzione del comando stesso.
Una volta eseguito il comando, la bash ritorna un
codice (return code); questo a sua volta può
essere usato in comandi successivi.
33. LA BASH SHELL
I file di configurazione :
La shell può usare cinque files di configurazione,
ma spesso nelle varie distribuzioni non vengono
usati tutti, d'altra parte vedremo che non è difficile
crearsene di propri. I file sono:
/etc/profile file globale
/etc/bashrc file globale
~/.bash_profile file locale
~/.bashrc file locale
~/.bash_logout file locale
34. LA BASH SHELL
N.B. File globali contengono direttive di
configurazione valide per tutti gli utenti mentre file
locali, contengono direttive di configurazione
valide solo per l'utente che possiede la cartella
nella directory /home che li contiene.
35. LA BASH SHELL
Esiste inoltre esiste una directory /etc/skel
(abbreviazione di skeleton) dove è possibile
inserire un files .bashrc .bash_logout
.bash_profile che saranno inseriti nella home
directory dei nuovi utenti e che rappresenteranno
la base per la loro configurazione e
personalizzazione dell'ambiente di lavoro.
36. LA BASH SHELL
/etc/profile
E' il file di configurazione globale che determina le
variabili di ambiente e i programmi da eseguire
per ogni utente che manda in esecuzione la shell.
Per fare un paragone con il mondo Dos potrebbe
essere qualcosa di molto simile al file
autoexec.bat.
37. LA BASH SHELL
/etc/bashrc
E' un file di configurazione globale molto simile al
precedente, per questo motivo spesso non e'
usato, contiene alias (collegamenti brevi a
comandi molto lunghi), e pezzi di codice nel
linguaggio di scripting della shell che devono
essere eseguiti alla partenza della shell. Tutto può
essere spostato senza problema nel file
/etc/profile.
38. LA BASH SHELL
~/.bash_profile
E' un file di configurazione locale che contiene
direttive di configurazione e variabili di ambiente
specifiche dell'utente al quale appartiene la
directory /home in cui si trova. Il file viene letto ed
eseguito successivamente a quelli globali e
modifica o sovrascrive variabili che riguardano
esclusivamente l'utente.
39. LA BASH SHELL
~/.bashrc
E' un file di configurazione locale che contiene
direttive di configurazione come gli alias, o
funzioni definite dall'utente. Il file viene letto ed
eseguito successivamente a quelli globali, gli alias
o le funzioni saranno specifici dell'utente e non
influenzeranno nessun altro utente.
E' il corrispondente locale di /etc/bashrc.
40. LA BASH SHELL
~/.bash_logout
E' un file di configurazione locale che contiene
comandi da eseguire quando l'utente esce dalla
shell. I comandi influenzano solo l'utente che
possiede la cartella /home nella quale si trova.
41. LA BASH SHELL
VEDIAMO ORA LA STRUTTURA E IL LANCIO DI
UNA PROCEDURA BASH
N.B. Questo concetto verrà poi espanso
ulteriormente nel corso delle lezioni
42. LA BASH SHELL
● La procedura BASH è anche chiamata “script”,
perché si tratta sempre di un file di testo.
● All'interno i commenti iniziano con il carattere #
● La struttura di uno “script” è molto semplice: ha
2 sole parti, di cui una è persino opzionale.
Esse sono:
– Il preambolo: è opzionale e ha la forma di
una riga di commento. Definisce quale shell
deve essere utilizzata per eseguire quel dato
script.
43. LA BASH SHELL
– Il corpo dello script: è la parte che elenca i
comandi elementari da eseguire, disposti su
righe diverse o sulla medesima riga,
eventualmente separati dal “;”.
N.B. Vedi esempio di script “Hello World”
44. LA BASH SHELL
Per eseguire il semplice script appena mostrato la
prima cosa da fare è renderlo eseguibile con il
comando chmod +x nomefile
Questo, perché ogni script è essenzialmente un
file di testo, quindi il diritto di esecuzione è negato
per default.
45. LA BASH SHELL
Si noti che deve essere dato il nome assoluto del
comando, perché il direttorio in cui risiede non è
necessariamente incluso nella variabile PATH.
N.B. l'argomento verrà trattato meglio in seguito
46. LA BASH SHELL
Diamo uno sguardo a quello che succede quando
una procedura viene eseguita.
47. LA BASH SHELL
La SHELL viene lanciata al Login dell'utente
(schema iniziale SHELL), creando il relativo
processo (ambiente di esecuzione).
È la SHELL di base, che si occupa di lanciare
altre SHELL per l'esecuzione dei comandi di
utente. La si può definire Shell PADRE.
48. LA BASH SHELL
– Quando viene richiesta l'esecuzione di uno
script, la SHELL PADRE crea una SHELL FIGLIO
seguendo la direttiva contenuta nel preambolo.
–La SHELL FIGLIO esegue il comando passatogli
dalla SHELL PADRE
49. LA BASH SHELL
– Quando viene richiesta l'esecuzione di uno
script, la SHELL PADRE crea una SHELL FIGLIO
seguendo la direttiva contenuta nel preambolo.
–La SHELL FIGLIO esegue il comando passatogli
dalla SHELL PADRE (Es. con lo script Hello
World, viene eseguito il comando echo sullo
standard output la stringa e il parametro
passatogli dalla SHELL PADRE)
51. LA BASH SHELL [VARIABILI]
Il metodo più usato per archiviare
temporaneamente uno o più valori consiste
nell'usare le variabili, cioè usare un'area di
memoria del computer assegnandogli un nome a
cui si possa far riferimento in seguito per
recuperare il valore assegnato.
52. LA BASH SHELL [VARIABILI]
Bash considera le variabili come se fossero
esclusivamente stringhe di caratteri.
Per le operazioni numeriche sulle variabili è
necessario usare il comando expr
> a=2
> b=3
> expr $a + $b
5
53. LA BASH SHELL [VARIABILI]
Le variabili possono essere:
● Locali: proprie di un singolo ambiente
utente
● Globali: proprie di tutti gli ambienti
54. LA BASH SHELL [VARIABILI]
Le variabili di ambiente sono quelle variabili
create autonomamente dal sistema operativo e
normalmente sono definite nel file '/etc/profile' ,
come per esempio SHELL, PS1, PS2 .
Sono in definitiva quelle variabili proprie di ogni
singolo processo in esecuzione.
55. LA BASH SHELL [VARIABILI]
Le variabili locali sono quelle variabili definite
dall'utente e sono generalmente definite nel file
~/.bashrc che si trova nella /home dell'utente del
quale possono influenzare l'ambiente.
N.B. E' necessario un chiarimento!
56. LA BASH SHELL [VARIABILI]
La definizione di una variabile avviene in un
modo intuitivo e elementare.
Consta di tre parti: il nome della variabile seguito
dall'operatore di assegnamento "=" e il valore da
assegnare, cioè:
'nome_variabile=valore_variabile'
57. LA BASH SHELL [VARIABILI]
Una volta definita la variabile la possiamo rendere
disponibile a tutti i programmi che l'utente usa con
il comando export :
'export nome_variabile'
N.B. Questo rende la variabile “Globale”
58. LA BASH SHELL [VARIABILI]
Per accedere al valore di una variabile cioè per
recuperarne il valore dobbiamo far precedere al
nome variabile il suffisso "$".
Per esempio per conoscere il valore della
variabile SHELL possiamo digitare il comando:
'echo $SHELL'
Che informazione si avrà a video?
59. LA BASH SHELL [PATH]
La prima variabile da configurare è la variabile
PATH che definisce le directory a cui possiamo
accedere da qualsiasi punto del filesystem.
Per esempio potremmo avere un programma nella directory
'/bin' chiamato mio_prog, se la directory '/bin' è presente nella
variabile PATH possiamo lanciare il programma da qualsiasi
posizione nel filesystem, altrimenti saremmo costretti o a
digitare l'intero percorso '/bin/mio_prog' oppure portarci nella
directory digitando prima 'cd /bin' e successivamente
'./mio_prog'.
60. LA BASH SHELL [PATH]
l punto e la barra traversa (slash) che precedono
il nome del programma dicono alla shell di
cercare di eseguire quel file se ci sono i permessi
adatti. La variabile PATH è definita in /etc/profile e
ha una sintassi leggermente diversa dal normale;
ogni percorso di directory alla destra
dell'operatore di assegnazione "=" e separata dal
carattere ":" ,esempio:
PATH=/bin:/usr/bin:/usr/local/bin
export PATH
61. LA BASH SHELL [PATH]
La variabile dell'esempio precedente rende
possibile mandare in esecuzione da qualsiasi
punto del filesystem tutti gli eseguibili che si
trovano nelle cartelle dichiarate.
62. LA BASH SHELL [PATH]
Se noi volessimo aggiungere altri valori alla
variabile PATH potremmo digitare semplicemente:
PATH=$PATH:/home/test/bin
export PATH
che aggiungerà al valore già' esistente della
variabile PATH il nostro nuovo valore, infatti il
nome variabile preceduto dal simbolo "$" verrà
espanso con il contenuto originale della variabile.
63. LA BASH SHELL [PATH]
Per fissare meglio le idee:
/bin:/usr/bin:/usr/local/bin
che diventerà
/bin:/usr/bin:/usr/local/bin:/home/test/bin
Si può modificare il proprio path inserendo il
comando precedente in ~/.bash_profile.
64. LA BASH SHELL [PROMPT]
Il prompt non è altro che il sistema in attesa di
input dall'utente, la sua forma varia da
distribuzione a distribuzione e può avere una
struttura simile a questa:
nome_utente@nome_computer:[#,$,>]
Che risulterebbe:
root@localhost:#
65. LA BASH SHELL [PROMPT]
root@localhost:#
Questo prompt può essere specialmente utile per
le persone che accedono a varie macchine con
account con nomi diversi, serve per ricordarsi
sempre su quale pc stiamo lavorando e di quali
privilegi disponiamo.
66. LA BASH SHELL [PROMPT]
E' possibile personalizzare le informazioni del
prompt assegnando dei particolari valori alla
variabile PS1
Questa variabile accetta dei valori predefiniti che
sono ottenuti facendo seguire alla barra
rovesciata (backslash)
[Rif. Documento Elenco Variabili Interne e
comandi]
67. LA BASH SHELL [PROMPT]
Utilizzando la bash, si può impostare il prompt
cambiando il valore della variabile d'ambiente
PS1, come segue:
$ PS1="> "
$ PS1="Il mio super prompt > "
$ PS1="`uname -r` $ "
$ PS1="u@H > "
N.B. Verificare a terminale quali sono gli effetti di
questi comandi.
68. LA HISTORY DELLA BASH
La shell e' in grado di ricordare i comandi immessi
dall'utente che normalmente sono salvati nel file
~/.bash_history e possono essere richiamati
premendo i tasti freccia in su' e freccia in giù,
questo comportamento può essere modificato
configurando le variabili:
HISTSIZE
HISTFILE
HISTFILESIZE
69. LA HISTORY DELLA BASH
E' da ricordare che per abitudine le variabili di
ambiente vengono indicate usando lettere
maiuscole a differenza delle locali per cui si usano
le minuscole. Queste variabili sono definite in
/etc/profile ma possono essere
sovrascritte in ~/.bash_profile.
70. LA HISTORY DELLA BASH
HISTSIZE
Definisce il numero massimo dei comandi da
memorizzare nel file storico normalmente il valore
preimpostato è 500 o più comandi.
HISTSIZE=10
Memorizza solo 10 comandi nella HISTORY
71. LA HISTORY DELLA BASH
HISTFILE
Indica il file che deve essere usato per contenere i
comandi digitati normalmente il valore
preimpostato è ~/.bash_history, può anche non
essere impostato, lo storico si limiterà alla
sessione di lavoro corrente.
HISTFILE=~/.storico_comandi
Memorizza la HISTORY nel file .storico_comandi
72. LA HISTORY DELLA BASH
HISTFILESIZE
Determina la grandezza fisica massima che può
avere il file dello storico.
HISTFILESIZE=1000
Vengono memorizzate 1000 righe di HISTORY
HISTFILESIZE=0
Con questo parametro la History non viene
memorizzata a fine sessione
73. LA BASH SHELL [ALIAS]
Gli alias si possono definire come comandi
"accorciati". Se vogliamo chiamare un comando
lungo in maniera più mnemonica possiamo
assegnarlo ad un alias.
74. LA BASH SHELL [ALIAS]
Se per esempio volessimo evitare di digitare
ogni volta il comando:
ls -laF
potremmo assegnarlo nel file /etc/bashrc oppure
~/.bashrc nel seguente modo:
alias ls='ls -laF'
Si possono definire quanti alias servono senza
particolari limiti.