Personalizzazione dell'ambiente di shell

Loris Tissino

15 luglio 2009

Variabili e valori

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

Variabili

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 è

Esportazione delle variabili

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

Variabili d'ambiente

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

Variabili d'ambiente interessanti

Alcune variabili degne di nota:

Modificatori di variabili

Può capitare di voler accedere solo a parte di variabile (una sottostringa). La cosa è fattibile tramite i modificatori di variabile. Eccone alcuni:

I prompt della shell

La Bash mette a disposizione quattro messaggi di sollecito (prompt) che possono essere personalizzati:

  1. PS1 (primario)
  2. PS2 (usato per il completamento delle stringhe su più righe)
  3. PS3 (usato per la gestione dei menù con select)
  4. PS4 (usato per la traccia di esecuzione)

Personalizzazione del prompt

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"

Personalizzazione della variabile PATH

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ò).

Personalizzazione dei colori della lista dei file

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.

  1. digitare dircolors -p > elencocolori per produrre un file contenente le corrispondenze attuali
  2. modificare il file elencocolori con l'editor preferito
  3. digitare dircolors elencocolori > comandi per far leggere il file di configurazione e produrre i comandi necessari per l'uso da parte della Bash
  4. eseguire source comandi per eseguire i comandi e impostare la variabile LS_COLORS

Alias

È 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:

Funzioni

È 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.

Funzioni wrapper

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 ..

Ordine di ricerca

Dove verrà cercato il comando da eseguire?

L'ordine di ricerca dovrebbe essere il seguente:

  1. alias
  2. funzione
  3. comando built-in
  4. hash
  5. path

Qual è l'ambiente?

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]);
    }
}

Esecuzione con ambiente modificato

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

Shebang indipendente dalle locazioni dei file

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.).

Impostazioni della shell Bash

Alcuni comportamenti della Bash possono essere impostati agendo su delle opzioni interne. Particolarmente interessanti risultano:

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

File di configurazione

I file di configurazione dove è possibile impostare variabili, alias, funzioni, ecc. sono diversi (alcuni "di sistema", altri gestibili dal singolo utente).