Corso Bash
-
Upload
franco-tampieri -
Category
Software
-
view
367 -
download
3
Transcript of Corso Bash
Programmazione Bash ShellProgrammazione Bash Shell
Concetti e Fondamenti per la programmazione di script e procedure in Shell Bash
PERCHE' UN CORSO SULLA BASH?!?
La risposta è semplice, avete mai provato a digitare sulla console del vostro sistema UNIX:
:/> man bash
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?
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
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
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.
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.
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
COMPORTAMENTO DI UNA SHELL
Lo schema base di funzionamento può essere riassunto così:
Loop forever<accetta comando da console><esegui comando>
end Loop
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
PROCESSO
Processo: è l'ambiente in cui è eseguito un programma: può essere di due tipi:
●UserKernel (o System)
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
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.
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'
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)
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.
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.
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.
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.
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.
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.
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”
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: $(...)
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)
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.
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.
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
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.
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.
LA BASH SHELL
/etc/profileE' il file di configurazione globale che determina le
variabili di ambiente e i programmi da eseguireper 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.
LA BASH SHELL
/etc/bashrcE' 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.
LA BASH SHELL
~/.bash_profileE' 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.
LA BASH SHELL
~/.bashrcE' 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.
LA BASH SHELL
~/.bash_logoutE' 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.
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
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.
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”
LA BASH SHELL
Per eseguire il semplice script appena mostrato la prima cosa da fare è renderlo eseguibile con il
comando chmod +x nomefileQuesto, perché ogni script è essenzialmente un
file di testo, quindi il diritto di esecuzione è negato per default.
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
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.
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
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)
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.
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 + $b5
LA BASH SHELL [VARIABILI]
Le variabili possono essere:
● Locali: proprie di un singolo ambiente utente
● Globali: proprie di tutti gli ambienti
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.
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!
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'
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”
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?
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'.
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
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.
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.
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.
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:#
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.
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]
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.
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:
HISTSIZEHISTFILEHISTFILESIZE
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 esseresovrascritte in ~/.bash_profile.
LA HISTORY DELLA BASH
HISTSIZEDefinisce il numero massimo dei comandi da
memorizzare nel file storico normalmente il valore preimpostato è 500 o più comandi.
HISTSIZE=10Memorizza solo 10 comandi nella HISTORY
LA HISTORY DELLA BASH
HISTFILEIndica 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_comandiMemorizza la HISTORY nel file .storico_comandi
LA HISTORY DELLA BASH
HISTFILESIZEDetermina la grandezza fisica massima che può
avere il file dello storico.
HISTFILESIZE=1000Vengono memorizzate 1000 righe di HISTORY
HISTFILESIZE=0Con questo parametro la History non viene
memorizzata a fine sessione
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.
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.