2012-02-05 20 views
38

BASHでは、関数本体で関数名を取得できますか?次のコードを例として、関数名 "Test"を本文に出力したいが、 "$ 0"は関数名の代わりにスクリプト名を参照しているようだ。だから関数名を取得する方法は?BASHでは、関数本体で関数名を取得できますか?

#!/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 

答えて

64

${FUNCNAME[0]}を試してみてください。この配列には、現在の呼び出しスタックが含まれます。マニュアルページを引用するには:

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. 
+1

ありがとう、これは本当に役立ちます。私は私の質問の解決策以上のことを学びます。この配列は、スクリプトが失敗したときにコールスタックを印刷するために使用できます。 –

+5

その点で、 'BASH_LINENO'の内容が興味のあるものであることが分かります。 – FatalError

+0

また、より短い同等の$ FUNCNAMEを使用することもできます。 –

29

関数の名前は${FUNCNAME[ 0 ]} FUNCNAMEであるので、コールスタック内の関数のすべての名前を含む配列である:

 
$ ./sample 
foo 
bar 
$ cat sample 
#!/bin/bash 

foo() { 
     echo ${FUNCNAME[ 0 ]} # prints 'foo' 
     echo ${FUNCNAME[ 1 ]} # prints 'bar' 
} 
bar() { foo; } 
bar 
関連する問題