2009-09-18 10 views
2

Dans mon script dans bash, il y a beaucoup de librairies incluses et j'utilise des fonctions déclarées dans ces fichiers. Comme ceci:Où est la déclaration de la fonction dans bash?

#!/bin/bash 
. foo.inc 
. bar.inc 
. baz.inc 

function_1 
function_2 
function_3 

EOF 

Ma question est comment savoir quel fichier contient la déclaration function_1? En cours d'exécution de ce script.

+2

Pourquoi ne regardez-vous pas dans foo.inc, bar.inc et baz.inc? –

+0

Si j'ajoute une nouvelle inclusion, je devrai ajouter un nouveau code à ma fonction de recherche. –

Répondre

1

Vous ne savez pas. Vous devrez grep les fichiers inclus pour la définition

+0

Je ne veux pas être dépendant d'inclus ... –

+0

Ensuite, vous ne devez pas les inclure. Désolé, je ne comprends pas complètement votre problème. Si vous incluez les fichiers dont vous dépendez, – Mark

+0

Je ne veux pas ajouter un nouveau grep, quand j'inclus une nouvelle lib ... type -t fonction_1 peut dire que c'est une fonction type -f ping peut dire où est le fichier Peut-il y avoir un moyen d'apprendre dans quel fichier ma fonction a défini ...? –

1

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 
+0

@Grokix: J'ai ajouté quelques informations supplémentaires. –

Questions connexes