Le variabili sono dei contenitori di valori.
Nella bash si possono assegnare valori alle variabili in maniera molto semplice. Bisogna però ricordarsi di non mettere spazi prima o dopo il segno =
:
$ NOME = mario
bash: NOME: command not found
$ NOME= mario
bash: mario: command not found
$ NOME=mario
Per recuperare il valore di una variabile, si deve anteporre il segno $
al nome:
$ echo $NOME
mario
Esistono due tipi di variabili:
Nell'esempio che segue, viene assegnato un valore a una variabile, viene visualizzato il valore della variabile (insieme al PID della shell), viene aperta una shell figlia e viene mostrato che il valore non è stato ereditato in quest'ultima:
$ NOME=mario # quando si assegna un valore non bisogna mettere uno spazio prima dell'uguale!
$ echo Nella shell $$ NOME è $NOME
Nella shell 10076 NOME è mario
$ bash
$ echo Nella shell $$ NOME è $NOME
Nella shell 10234 NOME è
Le variabili possono essere esportate per far sì che il loro valore sia letto anche dai processi figli (incluse le sottoshell). L'esportazione è unidirezionale (le sottoshell non possono esportare le variabili verso la shell genitore).
L'esportazione si effettua con il comando export
(anche direttamente in sede di assegnazione del valore).
$ export NOME=mario
$ echo Nella shell $$ NOME è $NOME
Nella shell 10076 NOME è mario
$ bash
$ echo Nella shell $$ NOME è $NOME
Nella shell 10340 NOME è mario
Le variabili d'ambiente sono disponibili per i processi figli.
Molte variabili si trovano già preimpostate (grazie ai file di configurazione). Per vedere il valore delle variabili correntemente impostate, si può usare il comando set
(che mostra anche le variabili di shell) o il comando env
(che mostra solo le variabili d'ambiente); per vedere il valore di una singola variabile, il comando echo
.
$ set| head -5
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_COMPLETION=/etc/bash_completion
BASH_COMPLETION_DIR=/etc/bash_completion.d
$ echo $BASH
/bin/bash
Alcune variabili degne di nota:
HOSTNAME
: il nome del sistemaPATH
: il percorso di ricerca degli eseguibiliHOME
: la propria home directoryUSERNAME
: il proprio nome utenteTERM
: il tipo di terminaleLANG
: la lingua sceltaEDITOR
: l'editor preferitoIFS
: internal field separator, il carattere usato come separatorePuò capitare di voler accedere solo a parte di variabile (una sottostringa). La cosa è fattibile tramite i modificatori di variabile. Eccone alcuni:
$ x=file.c; echo ${x%.c}.o --> file.o
)$ x=posix/src/std; echo ${x%%/*} --> posix
)$ x=$HOME/src/cmd; echo ${x#$HOME} --> /src/cmd
)x=/one/two/three; echo ${x##*/} --> three
)$ x=abcdef; echo ${x:4} --> ef
)$ x=abcdef; echo ${x:2:3} --> cde
)$ unset x; echo ${x:-altro} --> altro
)La Bash mette a disposizione quattro messaggi di sollecito (prompt) che possono essere personalizzati:
PS1
(primario)PS2
(usato per il completamento delle stringhe su più righe)PS3
(usato per la gestione dei menù con select
)PS4
(usato per la traccia di esecuzione)I prompt possono essere personalizzati modificando il valore delle variabili d'ambiente corrispondenti:
PS1='\W (\t)\$ ' # directory di lavoro, più ora corrente
intro-linux (15:16:37)$
$ PS1='\d \u \$ ' # data corrente, più nome utente
ven mar 21 loris $
$ PS2='(continua...) > '
$ mkdir "una directory che
(continua...) > nel nome...
(continua...) > ha dei caratteri di ritorno carrello"
La variabile PATH è usata per specificare in quale directory devono essere cercati gli eseguibili.
Ad esempio, si può impostare la variabile aggiungendo la directory corrente ai valori attuali:
$ echo $PATH
/home/loris/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ PATH="$PATH:."
$ echo $PATH
/home/loris/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:.
In questo modo sarà possibile eseguire gli script della directory corrente senza dover digitare ./
prima del nome del file (non che questo sia raccomandabile, però).
Il comando ls
mostra i nomi dei file colorati a seconda dell'estensione, basandosi sul valore della variabile LS_COLORS
. Il valore di tale variabile può essere modificato sfruttando il programma dircolors.
dircolors -p > elencocolori
per produrre un file contenente le corrispondenze attualielencocolori
con l'editor preferitodircolors elencocolori > comandi
per far leggere il file di configurazione e produrre i comandi necessari per l'uso da parte della Bashsource comandi
per eseguire i comandi e impostare la variabile LS_COLORSÈ possibile definire delle scorciatoie per l'esecuzione di alcuni comandi, o di alcuni comandi con determinate opzioni predefinite. Queste scorciatoie sono chiamate alias.
$ alias ll='ls -l'
$ ll
total 8
-rw-r--r-- 1 loris loris 655 2008-03-21 15:48 uno
-rw-r--r-- 1 loris loris 2780 2008-03-21 15:45 due
-rw-r--r-- 1 loris loris 0 2008-03-21 15:45 tre
Note:
È possibile definire delle funzioni.
$ function saluta { ORA=$(date +'%k'); [[ $ORA < 13 ]] && echo buongiorno || echo buon pomeriggio; }
$ saluta
buon pomeriggio
Le funzioni possono essere utilizzate passando loro dei parametri (che vedranno come $1
, $2
ecc.).
Le funzioni possono essere esportate con export -f
.
Una funzione può costituire un wrapper per un comando builtin. All'interno della definizione della funzione, si dovrà usare il comando builtin
per richiamare il comando built-in stesso.
$ cd() { builtin cd "$1" && echo "cambiata directory in $1"; }
$ cd ..
cambiata directory in ..
Dove verrà cercato il comando da eseguire?
L'ordine di ricerca dovrebbe essere il seguente:
Un programma può sapere quali sono le variabili d'ambiente impostate. Il prototipo di un programma C potrebbe essere questo:
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
int x;
for (x=0; envp[x] != 0; ++x){
printf("%d: %s\n", x, envp[x]);
}
}
Un comando può essere eseguito in un ambiente modificato (eliminando alcune delle o tutte le variabili d'ambiente):
$ env -i date # esecuzione con ambiente "svuotato"
Fri Mar 21 17:57:29 CET 2008
$ env -u LANG cal # esecuzione con variabile "disimpostata"
March 2008
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Un motivo per usare il programma env è anche quello di poter predisporre degli script la cui prima riga (nota come bang path o shebang) sia indipendente dalla locazione dei programmi eseguibili.
Ad esempio, spesso la prima riga di uno script python contiene nella prima riga:
#!/usr/bin/env python
Questo fa sì che lo script possa essere eseguito indipentemente dalla posizione dell'interprete python (che potrebbe essere /usr/bin/python, /usr/local/bin/python ecc.).
Alcuni comportamenti della Bash possono essere impostati agendo su delle opzioni interne. Particolarmente interessanti risultano:
set -o allexport
(set -a
): esporta automaticamente le variabili createset -o noclobber
(set -C
): fa sì che non vengano sovrascritti file con la ridirezione dell'outputset -o nounset
(set -u
): fa sì che venga considerato errore riferirsi ad una variabile non impostataset -o ignoreeof
: fa sì che venga ignorato un eventuale (accidentale) EOF (ctrl-D)Le opzioni sono impostate con set -o
e disimpostate con set +o
.
$ touch uno
$ set -o noclobber
$ cal > uno
bash: uno: cannot overwrite existing file
$ set +o noclobber
$ cal > uno
$ set -o nounset
$ echo $NONESISTENTE
bash: NONESISTENTE: unbound variable
I file di configurazione dove è possibile impostare variabili, alias, funzioni, ecc. sono diversi (alcuni "di sistema", altri gestibili dal singolo utente).