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 !
Salut,
Je suis content de voir que je ne suis pas le seul à me tourner vers les bibliothèques bash.
Je réfléchissais justement à comment mettre en place un « ifndef ».
Connais-tu d’autres bibliothèques ?
KooK
Salut KooK ! (désolé pour le temps de réponse)
J’avoue que je n’ai pas trop cherché sur le net s’il existe déjà des bibliothèques de fonctions en bash, mais là je suis en train d’en m’en fabriquer une
Je pioche par ci par là des scripts déjà écrits, j’en fais des fonctions, j’écris ce qui manque…
J’essaie de faire en sorte que la bibliothèque permette de réaliser facilement des scripts pouvant être lancé en console ET graphiquement (genre clic droit dans thunar ou autre)
Je peux mettre les fichiers (le « projet ») sur GitHub si tu veux y accéder/participer, mais bon pour l’instant y’a vraiment pas grand-chose
#EDIT: j’ai effectivement trouvé des bibliothèques sur le net, voici une page qui en liste pas mal
http://dberkholz.com/2011/04/07/bash-shell-scripting-libraries/