51 votes

Est-il possible d'obtenir le nom de la fonction dans le corps de la fonction ?

En BASH, est-il possible d'obtenir le nom de la fonction dans le corps de la fonction ? En prenant les codes suivants comme exemple, je souhaite imprimer le nom de la fonction "Test" dans son corps, mais "$0" semble faire référence au nom du script au lieu du nom de la fonction. Alors comment obtenir le nom de la fonction ?

 #!/bin/bash

function Test
{
    if [ $# -lt 1 ]
    then
        #   how to get the function name here?
        echo "$0 num" 1>&2
        exit 1
    fi
    local num="${1}"
    echo "${num}"
}

#   the correct function
Test 100

#   missing argument, the function should exit with error
Test

exit 0

87voto

FatalError Points 19772

Essayez ${FUNCNAME[0]} . Ce tableau contient la pile d'appels actuelle. Pour citer la page de manuel :

    FUNCNAME
          An  array  variable  containing the names of all shell functions
          currently in the execution call stack.  The element with index 0
          is the name of any currently-executing shell function.  The bot
          tom-most element is "main".  This variable exists  only  when  a
          shell  function  is  executing.  Assignments to FUNCNAME have no
          effect and return an error status.  If  FUNCNAME  is  unset,  it
          loses its special properties, even if it is subsequently reset.

35voto

William Pursell Points 56211

Le nom de la fonction est en ${FUNCNAME[ 0 ]} FUNCNAME est un tableau contenant tous les noms des fonctions dans la pile des appels, donc :

 $ ./échantillon
 foo
 bar
 $ échantillon de chat
 #!/bin/bash

 foo() {
 echo ${FUNCNAME[ 0 ]} # affiche 'foo'
 echo ${FUNCNAME[ 1 ]} # affiche 'bar'
 }
 bar() { foo; }
 bar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X