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