Edit:
Dans votre script, ajoutez la ligne suivante:
shopt -s extdebug
alors vous pouvez récupérer le nom du fichier source et la ligne numéro dans ce fichier que la définition de la fonction commence:
def=($(declare -F function_1))
echo "function name: ${def[0]}"
echo "line number: ${def[1]}"
echo "file name: ${def[@]:2}" # the array slice makes it work even if the filename contains spaces
réponse originale:
Vous ne devriez pas avoir besoin de savoir à l'exécution quel fichier fournissait une fonction. Peut-être que si vous avez posté votre code, nous pourrions mieux voir ce dont vous avez besoin.
Lorsque vous sourcez un fichier (en utilisant ". foo.inc
" par exemple), c'est comme si c'était dans le fichier principal.
Si vous avez besoin, pour une raison quelconque, de savoir si elle est encore chargé, vous pourriez faire quelque chose de laid (semblable aux enfants dans la voiture pleurons toutes les quelques secondes « sommes-nous encore là? »):
function_check()
{
local fn found notfound;
for fn in $function_list;
do
if [[ -n $(declare -F $fn) ]]; then
found+=$fn" ";
else
notfound+=$fn" ";
fi;
done;
echo $found;
function_list=$notfound
}
function_list="function_1 function_2 function_3"
. foo.inc
foo_list=$(function_check)
. bar.inc
bar_list=$(function_check)
. baz.inc
baz_list=$(function_check)
echo "Warning: the following functions were not found: $function_list"
La fonction function_check
vérifie l'existence des fonctions énumérées dans $function_list
et, si elles sont trouvées, leur fait écho et les supprime de la liste. (dire que trois fois rapides!)
Modifier:
est ici un moyen de faire ce que je pense peut être très proche de ce que vous voulez:
En chaque de vos fonctions, ajouter un test pour une option qui retourne sa source comme ceci:
function_1()
{
if [[ $1 == "--source" ]]
then
echo "source: ${BASH_SOURCE}"
return
fi
# do your function stuff
}
Ensuite, dans votre script, vous pouvez source les fichiers contenant les fonctions et de trouver la source d'un particulièremen La fonction r:
function_1 --source
va renvoyer le nom de fichier dont elle provient. Et bien sûr, vous pouvez agir:
if [[ $(function_1 --source) == /some/dir/file ]]
then
do_something
fi
Pourquoi ne regardez-vous pas dans foo.inc, bar.inc et baz.inc? –
Si j'ajoute une nouvelle inclusion, je devrai ajouter un nouveau code à ma fonction de recherche. –