Script bash
Argomenti
- Cos’è una shell?
- Quanti tipi di shell ci sono?
- Lista delle shell installate
- Cambiare la propria shell
- Rendere permanente la nuova shell
- Il mio primo script, cosa mi serve?
- Cambiare i permessi di esecuzione
- Le variabili
- #!/bin/bash
- Debug
- Cosa sono i Builtin Bash?
- Parametri speciali
Cos’è una shell?
La shell (detta anche interprete dei comandi), in informatica, è la parte di un sistema operativo che permette agli utenti di interagire con il sistema stesso, impartendo comandi e richiedendo l’avvio di altri programmi. Insieme al kernel costituisce una delle componenti principali di un sistema operativo. Il suo nome (dall’inglese shell, guscio) deriva dal fatto che questa componente viene considerata l’involucro, la parte visibile del sistema ed è dunque definibile come l’interfaccia utente o il programma software che la rende possibile.
Quanti tipi di shell ci sono?
Fondamentalmente due: grafiche e testuali
Le shell più usate sono: Bash, C Shell, Z Shell, Korn Shell, Bourne Shell. Di defaul nei sistemi GNU/Linux troviamo la Bash (Bourne Again Shell). Per accedere alle shell testuali con sistema avviato premere Ctrl+Alt+F1>F7. Nei sistemi derivati da Debian troviamo la shell grafica in F7 mentre nelle derivate CentOS in F1.
Per identificare la shell in uso digitiamo in un emulatore di terminale:
$ echo $0
$ env | grep SHELL
$ echo $SHELL
Lista delle shell installate
$ chsh -l
Cambiare la propria shell
$ chsh -s /bin/csh
e per renderla attiva
su nome_utente
..il prompt è chiaramente cambiato…..Stessa procedura per root:
# chsh -s /bin/bash
# su root
Da notare che sh (la Bourne Shell) è un link simbolico a Bash, quindi lanciando uno script con sh nome_script verrà eseguito da Bash
Rendere permanente la nuova shell
Per rendere permanente la modifica della shell editare con permessi di root il file /etc/passwd sia per l’utente che per root
Il mio primo script, cosa mi serve?
Un editor di testo come Gedit ed un emulatore di terminale come Gnome-terminal. Aprire Gedit ed inserire un comando di shell conosciuto (sudo apt-get update oppure su -c ‘yum update’), salvare con nome (esempio mioscript) nella propria home. Provare a lanciarlo con il comando bash mioscript. Da notare che se proviamo ad eseguire lo script con ./mioscript la shell ci risponderà con un messaggio di errore riguardante la mancanza di permessi di esecuzione.
Cambiare i permessi di esecuzione
Possiamo vedere che lo script non ha nessun permesso di esecuzione, usiamo quindi chmod u+x mioscript per renderlo eseguibile
Ora con ./mioscript andrà in esecuzione. Per poter lanciare lo script da qualunque directory (./mioscript funziona solo se si è nella stessa cartella in cui è presente lo script) dobbiamo spostarlo in una delle directory dichiarate nella variabile PATH.
Le variabili
Le variabili si distinguono in locali e globali. La variabile
$ MYVAR=”lugvicenza”
sarà disponibile solo per quella sessione di shell
$ echo $MYVAR
darà come output
lugvicenza
ma se apriamo un’altra bash e ridiamo il comando la variabile sarà vuota perché limitata a quella sessione di shell
possiamo esportare una variabile con:
$ export MYVAR=”lugvicenza”
in questo caso la shell aperta dalla sessione corrente trova disponibile la variabile esportata ma se apriamo una nuova shell la variabile esportata non sarà disponibile. Per renderla disponibile in tutte le shell dobbiamo renderla globale. La lista delle variabili globali si ottiene con:
$ env
Per esportare una variabile in globale modificare il file /etc/profile aggiungendo alla fine:
export MYVAR=”lugvicenza”
quindi riavviare il sistema o usare source per renderla subito disponibile:
$ source /etc/profile
Ora in qualunque shell aperta sarà disponibile la variabile $MYVAR e sarà presente anche nell’output di env. Compreso quindi il senso di variabile globale passiamo all’analisi della variabile globale PATH che indica le directory nelle quali il sistema cerca i file eseguibili.
$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/stefano/bin
Andiamo quindi a spostare mioscript in una delle suddette directory, preferibilmente ~/bin. Se questa directory non dovesse essere presente nel tuo PATH la puoi sempre aggiungere mettendola alla fine del file .bashrc con:
PATH=$PATH”:~/bin”
o
PATH=$PATH”:/home/nome_utente/bin” (sostituendo nome_utente)
$ source .bashrc
Ora proviamo a lanciare lo script semplicemente con
mioscript
#!/bin/bash
Tutti gli script iniziano con
#! /bin/bash
#! sono dei magic number ed informano il sistema che il file contiene una serie di comandi che devono essere passati all’interprete indicato (/bin/bash, /bin/csh o altra shell).
# (simbilo cancelletto) serve per commentare le righe dello script, esempio:
pwd # stampa directory corrente
ls # stampa lista files e direcory
Debug
Ora vediamo come fare il debug dei nostri script; possiamo debuggare tutto lo script aggiungendo l’opzione -x
$ mioscript -x
per farlo invece solo su una porzione di codice aggiungiamo set -x prima e set +x per la chiusura.
cd ~/bin
ls
set -x
cd ciao
set +x
in questo caso il debug verrà fatto solo per il comando cd ciao (che probabilmente darà errore per la mancanza della cartella ciao).
Cosa sono i Builtin Bash?
Un builtin è un comando appartenente alla serie degli strumenti Bash, letteralmente incorporato. Questo è stato fatto sia per motivi di efficienza — i builtin eseguono più rapidamente il loro compito di quanto non facciano i comandi esterni, che di solito devono generare un processo separato (forking) — sia perché particolari builtin necessitano di un accesso diretto alle parti interne della shell. (tratto da http://www.pluto.it/files/ildp/guide/abs/internal.html).
Possiamo notare la differenza impartendo il comando:
type echo e type /usr/bin/echo
Parametri speciali
$_
$$
$!
$0
$?
$#
$@ e $*
$-S