Comme bien souvent quand on écrit un script en Shell, on se pose la question des fichiers de paramètres et régulièrement on en arrive à gérer le petit -c configFile ou -f configFile. Cependant, lorsque des librairies sont à charger on veut être sûr de là où elles sont.

Dans mon cas, je mets mes librairies dans un sous répertoire du script à appeler. C'est classic et simple. Par contre, là où ça devient un brin chiant, c'est quand le file system contenant le script est truffé de liens symboliques et que le script est appelé via un lien ; une fois sur deux on retrouve pas ses petits.

J'ai donc pris l'habitude de commencer chacun de mes scripts avec les lignes suivantes (qui fonctionnent avec un vieux KSH ou Bash (et même sur AIX) :

__sName="${0}"; __pName="${0}";
if [ -L "${0}" ]; then
    __="$(command -v "readlink")"
    if [ "readlink" = "${__##*/}" ]; then
        __sName="$(readlink -m "${__sName}")"
    else
        __sName="$(set -- $(LC_ALL=C file "${0}"); echo ${5:1:$((${#5} - 2))})"; __sName="$(dirname "${__pName}")/$(dirname "${__sName}")/${__sName##*/}"
    fi
fi
__pName="$( cd "${__sName%/*}" ; pwd )"; __sName="${__pName}/${__sName##*/}"; __fName="${__sName##*/}"

Ainsi, je peux charger ce que j'ai besoin avec un . ${__pName}/lib/F01/common.lib

Donc :

  • __pName contient le chemin absolu du script (avec les liens suivis et tout et tout),
  • __sName contient le chemin complet et nom du script (avec les liens résolus, donc absolu),
  • __fName contient le nom final du script (et pas le nom du lien si appelé par un lien).