Corso Bash

75
Programmazione Bash Shell Programmazione Bash Shell Concetti e Fondamenti per la programmazione di script e procedure in Shell Bash

Transcript of Corso Bash

Programmazione Bash ShellProgrammazione Bash Shell

Concetti e Fondamenti per la programmazione di script e procedure in Shell Bash

Docente: Franco Tampieri

FONDAZIONE ALDINI VALERIANIper lo sviluppo della cultura tecnica

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

Che cosa è una Shell?

●Breve definizione●Storia●Struttura (Concetto di Software a Livelli)

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

● Hm... beh questa immagine non rende l'idea :)

DEFINIZIONE: SHELL

● Si, questa è già meglio ma manca qualche cosa...

DEFINIZIONE: SHELL

● Ecco questa è perfetta!!!

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

Diamo uno sguardo a quello che succede quando una procedura viene eseguita.

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

SHELLPADRE

SHELLFIGLIO

Generazione

Esecuzione

Risultato

Attesa delCompletamento

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.

FINE PRIMO GIORNO

● Domande?● Esercizi e compiti da fare :)