lunedì 28 gennaio 2008

Impostazione modulare delle variabili di ambiente Shell

Diversi software richiedono l'impostazione di variabili di ambienti per il loro utilizzo, specialmente quando si opera direttamente con la shell. Invece di memorizzare tutte le variabili di ambiente in un unico file, io propongo un approccio più modulare. In sostanza le variabili di ambiente sono raggruppate in base alla loro correlazione (es. quelle legate a Java, quelle legate a PostgreSQL, ecc.); ogni gruppo viene memorizzato all'interno di un proprio file con estensione .env (environment).
Ad esempio, ecco un file relativo a Java:

#!/bin/bash
if test -z "${JAVAHOME}"
then
JAVAHOME=/sviluppo/java/
JAVA_HOME=${JAVAHOME}/jdk
JDK_HOME="${JAVAHOME}/jdk"
JRE_HOME="${JDK_HOME}"
JAR_HOME="${JAVAHOME}/jars"
ANT_HOME="${JAVAHOME}/ant"
ECLIPSE_HOME="{JAVAHOME}/eclipse"


PATH="${JDK_HOME}/bin":"${PATH}":"${ANT_HOME}/bin"

# tengo conto di tutti i jar file messi nella jar home
for jarFile in "${JAR_HOME}"/*.jar
do
JAR_CLASSPATH="${jarFile}":"${JAR_CLASSPATH}"
done

CLASSPATH="${JAR_CLASSPATH}":"${CLASSPATH}"
classpath="${CLASSPATH}"


export JAVA_HOME
export JDK_HOME
export JRE_HOME
export JAR_HOME
export PATH
export CLASSPATH
export classpath
fi

Il file è piuttosto semplice: anzitutto si controlla se la definizione delle variabili è già stata fatta, nel qual caso non la si sovrascrive. Ciò viene controllato grazie alla variabile ${JAVAHOME}, dalla quale molte delle altre dipendono. In seguito, si definiscono i valori per le variabili di ambiente richieste (non tutte le variabili sono effettivamente richieste dal sistema, alcune sono definite per praticità o coerenza). Si noti la definizione di ${JAR_HOME}, che rappresenta una cartella che contiene i jar relativi a librerie esterne; tutti i jar sono aggiunti al classpath in modo da rendere le librerie accessibili. Infine si effettua l'esportazione delle variabili per renderle visibili anche ai sottoshell.

Per effettuare il caricamento automatico di questo file (e degli altri simili), occorre poi modificare il proprio .profile o .bash_profile aggiungendo il blocco che segue:

if [ -d $HOME/bin ]
then
for envFile in $HOME/bin/*.env
do
. $envFile
done
fi


Il blocco di codice qui sopra è piuttosto semplice: supponendo che i file .env si trovino nella cartella bin della home utente, si provvede al loro caricamento mediante l'operatore . (source).

Tramite questa soluzione è abbastanza semplice mantenere anche grosse quantità di variabili di ambiente senza perdere in modularità e semplicità di configurazione. Basterà dare un'occhiata al file .env relativo ad un sottosistema per ottenere la relativa configurazione.

Nessun commento: