2012-02-05 33 views
38

BASH'da, işlev adını işlev gövdesine almak mümkün mü? Aşağıdaki kodları örnek alarak, "Test" işlevini vücudunda yazdırmak istiyorum, ancak "$ 0", işlev adı yerine komut dosyasının adına başvuruyor gibi görünüyor. Peki işlev adı nasıl alınır? ${FUNCNAME[ 0 ]} FUNCNAME çağrı yığını tüm fonksiyonları isimleri içeren bir dizidir içindeBASH'da, işlev adını işlev gövdesine almak mümkün mü?

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

cevap

64

${FUNCNAME[0]} deneyin. Bu dizi mevcut çağrı yığınını içerir. Bu ilan için şu kullanıcı sayısı yeterli:

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

Teşekkürler, bu gerçekten yardımcı olur. Sadece sorumu çözmekten daha fazlasını öğreniyorum. Bu dizi, komut dosyası başarısız olduğunda çağrıları yazdırmak için kullanılabilir. –

+5

Elbette. Bu bağlamda, "BASH_LINENO" nun içeriğini de ilginizi çekebilir. – FatalError

+0

Veya daha kısa ve eşdeğer $ FUNCNAME kullanabilirsiniz. –

29

fonksiyonun adı böylece, şudur:

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

foo() { 
     echo ${FUNCNAME[ 0 ]} # prints 'foo' 
     echo ${FUNCNAME[ 1 ]} # prints 'bar' 
} 
bar() { foo; } 
bar 
İlgili konular