26-12-2010, 02:18 AM
Bash (acronimo per bourne again shell) è una shell testuale del progetto GNU usata nei sistemi operativi Unix e Unix-like, specialmente in GNU/Linux, ma disponibile anche per sistemi Microsoft Windows (vedi ad esempio Cygwin).
Si tratta di un interprete di comandi che permette all'utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite, o di eseguire programmi. bash è in grado di eseguire i comandi che le vengono passati, utilizzando la redirezione dell'input e dell'output per eseguire più programmi in cascata in una pipeline software, passando l'output del comando precedente come input del comando successivo.
Oltre a questo, bash mette a disposizione un semplice linguaggio di scripting che permette di svolgere compiti più complessi, non solo raccogliendo in uno script una serie di comandi, ma anche utilizzando variabili, funzioni e strutture di controllo del flusso.
Tecnicamente bash è un clone evoluto della shell standard di unix (/bin/sh) chiamata anche Bourne shell dal nome del suo autore originario Stephen Bourne. L'espansione dell'acronimo bash, Bourne again shell, letteralmente significa un'altra shell Bourne, ma Bourne again ha la stessa pronuncia di born again, cioè rinata creando la definizione finale shell rinata (un pessimo gioco di parole, secondo Linus Torvalds)[senza fonte].
Altre shell alternative a bash e piuttosto diffuse sono la Korn shell, la C shell e tcsh.
Bash e lo standard POSIX
Il comportamento predefinito di bash diverge da quello dello standard POSIX, ma esso si può ottenere in quattro modi:
specificando l'opzione "--posix" all'avvio, ad esempio con "bash --posix";
invocandola con il nome "sh", come è il caso in molti sistemi GNU/Linux in cui "/bin/sh" è un collegamento simbolico a "/bin/bash";
avviandola dopo aver impostato la variabile d'ambiente POSIXLY_CORRECT[1] con un valore qualsiasi;
eseguendo in essa il comando interno "set -o posix"[2].
File letti all'avvio
Alla partenza, bash tenta di caricare automaticamente una serie di file:
se si tratta di una shell di login, bash tenta di caricare:
il file "/etc/profile"
solo il primo tra i file ".bash_profile", ".bash_login" e ".profile" collocati nella home directory dell'utente e che risulti essere disponibile;
il file ".bashrc" collocato nella home directory dell'utente;
se si tratta di una shell interattiva non di login, bash tenta di caricare il solo file ".bashrc" collocato nella home directory dell'utente;
L'utente può modificare i file nella propria home directory per personalizzare il proprio ambiente di lavoro.
Quando bash è avviata non interattivamente (ad esempio per eseguire uno script di shell) essa controlla se esiste la variabile d'ambiente BASH_ENV o ENV ed in caso positivo carica il file specificato dal valore della variabile (se bash è avviata in modalità POSIX controlla solo ENV). Procede quindi ad eseguire il resto (script o altro).
Esempi esplicativi
Il seguente script permette di racchiudere all'interno dell'archivio
Con bash è possibile anche automatizzare operazioni quali l'aggiornamento del software utente: ad esempio, su un sistema Ubuntu è possibile aggiornare e pulire il sistema con il seguente script:
Creando in una delle directory elencate dalla variabile d'ambiente $PATH un file con il contenuto sopra esposto ed assegnandoli i permessi di esecuzione si può ottenere una comoda e semplice utility che può essere usata esattamente come qualunque altro file eseguibile.
Strutture condizionali
Confronta se i file "file_a" e "file_b" sono identici tramite il comando cmp (effettuando la redirezione dello standard output e dello standard error a /dev/null in modo da nascondere i suoi messaggi), e scrive a video il risultato:
Controlla se il file "prova.txt" esiste e scrive un messaggio al riguardo:
Chiede una riga in input e mostra un messaggio in base al contenuto:
Fonte : WikiPedia
Si tratta di un interprete di comandi che permette all'utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite, o di eseguire programmi. bash è in grado di eseguire i comandi che le vengono passati, utilizzando la redirezione dell'input e dell'output per eseguire più programmi in cascata in una pipeline software, passando l'output del comando precedente come input del comando successivo.
Oltre a questo, bash mette a disposizione un semplice linguaggio di scripting che permette di svolgere compiti più complessi, non solo raccogliendo in uno script una serie di comandi, ma anche utilizzando variabili, funzioni e strutture di controllo del flusso.
Tecnicamente bash è un clone evoluto della shell standard di unix (/bin/sh) chiamata anche Bourne shell dal nome del suo autore originario Stephen Bourne. L'espansione dell'acronimo bash, Bourne again shell, letteralmente significa un'altra shell Bourne, ma Bourne again ha la stessa pronuncia di born again, cioè rinata creando la definizione finale shell rinata (un pessimo gioco di parole, secondo Linus Torvalds)[senza fonte].
Altre shell alternative a bash e piuttosto diffuse sono la Korn shell, la C shell e tcsh.
Bash e lo standard POSIX
Il comportamento predefinito di bash diverge da quello dello standard POSIX, ma esso si può ottenere in quattro modi:
specificando l'opzione "--posix" all'avvio, ad esempio con "bash --posix";
invocandola con il nome "sh", come è il caso in molti sistemi GNU/Linux in cui "/bin/sh" è un collegamento simbolico a "/bin/bash";
avviandola dopo aver impostato la variabile d'ambiente POSIXLY_CORRECT[1] con un valore qualsiasi;
eseguendo in essa il comando interno "set -o posix"[2].
File letti all'avvio
Alla partenza, bash tenta di caricare automaticamente una serie di file:
se si tratta di una shell di login, bash tenta di caricare:
il file "/etc/profile"
solo il primo tra i file ".bash_profile", ".bash_login" e ".profile" collocati nella home directory dell'utente e che risulti essere disponibile;
il file ".bashrc" collocato nella home directory dell'utente;
se si tratta di una shell interattiva non di login, bash tenta di caricare il solo file ".bashrc" collocato nella home directory dell'utente;
L'utente può modificare i file nella propria home directory per personalizzare il proprio ambiente di lavoro.
Quando bash è avviata non interattivamente (ad esempio per eseguire uno script di shell) essa controlla se esiste la variabile d'ambiente BASH_ENV o ENV ed in caso positivo carica il file specificato dal valore della variabile (se bash è avviata in modalità POSIX controlla solo ENV). Procede quindi ad eseguire il resto (script o altro).
Esempi esplicativi
Il seguente script permette di racchiudere all'interno dell'archivio
Codice PHP:
"/var/my-backup.tar.gz" l'intero contenuto della directory "/home/bobbio":
#!/bin/bash
tar -cZf /var/my-backup.tar.gz /home/bobbio
Con bash è possibile anche automatizzare operazioni quali l'aggiornamento del software utente: ad esempio, su un sistema Ubuntu è possibile aggiornare e pulire il sistema con il seguente script:
Codice PHP:
#!/bin/bash
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get autoclean
sudo apt-get clean
Creando in una delle directory elencate dalla variabile d'ambiente $PATH un file con il contenuto sopra esposto ed assegnandoli i permessi di esecuzione si può ottenere una comoda e semplice utility che può essere usata esattamente come qualunque altro file eseguibile.
Strutture condizionali
Confronta se i file "file_a" e "file_b" sono identici tramite il comando cmp (effettuando la redirezione dello standard output e dello standard error a /dev/null in modo da nascondere i suoi messaggi), e scrive a video il risultato:
Codice PHP:
#!/bin/bash
if cmp file_a file_b &>/dev/null; then
echo "I File a e b sono identici."
else
echo "I File a e b sono diversi."
fi
Controlla se il file "prova.txt" esiste e scrive un messaggio al riguardo:
Codice PHP:
#!/bin/bash
if [ -f prova.txt ]; then
echo "Il file prova.txt esiste."
else
echo "Il file prova.txt non esiste o non è un file"
fi
Chiede una riga in input e mostra un messaggio in base al contenuto:
Codice PHP:
#!/bin/bash
echo "Scrivi qualcosa e premi Invio:"
read linea
case "$linea" in
uno)
echo "Hai digitato 'uno'"
;;
due|tre)
echo "Hai digitato 'due' oppure 'tre'"
;;
q*)
echo "Hai digitato qualcosa che inizia con 'q'"
;;
*)
echo "Hai digitato qualcosa che non conosco"
;;
esac
Fonte : WikiPedia