Je sais pas vous, mais moi je suis un fervent utilisateur de scripts écrits en bash, et j’ai parfois les mêmes fonctions qui reviennent dans plusieurs script indépendants. Alors je me suis dit, pourquoi ne pas écrire une fois pour toutes ces fonctions, et les inclure dans l’environnement (commande source) à chaque ouverture d’un terminal ?
.bashrc:
source "mon_fichier_de_fonctions"
...
Sauf qu’à force, on entasse pas mal de fonctions, et on a pas trop envie de polluer l’environnement de bash, et encore moins de ralentir son exécution, n’est-ce pas ? Alors j’ai codé 3 fonctions toutes simples qui imite quelque peu le comportement des directives pré-processeur #include, #ifndef, et #define du C.
Ainsi, en admettant que le chemin vers votre bibliothèque de fonctions soit contenu dans la variable library, ça donne :
# usage: define VAR [VALUE]
[ $# -ge 1 ] && eval $1=${2:-def} || return 1
}
ndef() {
# usage: if ndef VAR; then ...; fi
[[ $# -eq 1 && -z "$(eval echo \$$1)" ]] || return 1
}
include() {
# usage: include FILE_IN_LIBRARY
[[ $# -eq 1 && -f "$library/$1" ]] && . "$library/$1"
}
export -f define
export -f ndef
export -f include
Vous n’avez plus qu’Ã rajouter 2 lignes dans .bashrc du genre :
[ -f "$library/include" ] && source "$library/include"
… le fichier include contenant bien sûr ces trois fonctions (vous pouvez aussi mettre les 3 fonctions dans .bashrc, à vous de voir).
Exemple d’utilisation dans un fichier de votre bibliothèque :
Fichier blabla situé dans $library/io
define __FONCTION
fonction_blabla() {
echo "blabla"
}
fi # __FONCTION
Fichier is_int situé dans $library/math
define is_int is_integer
is_integer() {
printf "%d" $1 2>/dev/null >&2
return $?
}
fi # is_int
Exemple d’utilisation dans un script :
include io/blabla
include math/is_int
if $is_int $(fonction_blabla); then
echo "Ca m'étonnerait"
else
echo "Y'a plus de chances ici"
fi
Petite précision au cas où : il est bien évidemment possible d’imbriquer les inclusions entre fichiers !