2012-02-05 26 views
38

Trong BASH, bạn có thể lấy tên hàm trong phần thân hàm không? Lấy các mã sau đây làm ví dụ, tôi muốn in tên hàm "Kiểm tra" trong phần thân của nó, nhưng "$ 0" dường như chỉ đến tên kịch bản thay vì tên hàm. Vậy làm thế nào để có được tên hàm?Trong BASH, bạn có thể lấy tên hàm trong phần thân hàm không?

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

Trả lời

64

Hãy thử ${FUNCNAME[0]}. Mảng này chứa ngăn xếp cuộc gọi hiện tại. Để trích dẫn trang người đàn ông:

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

Cảm ơn, điều này thực sự hữu ích. Tôi học nhiều hơn chỉ là giải pháp cho câu hỏi của tôi. Mảng này có thể được sử dụng để in callstack khi kịch bản thất bại. –

+5

Chắc chắn. Về vấn đề đó, bạn cũng có thể tìm thấy nội dung của 'BASH_LINENO' để được quan tâm. – FatalError

+0

Hoặc bạn có thể sử dụng $ FUNCNAME ngắn hơn và tương đương. –

29

Tên của hàm là trong ${FUNCNAME[ 0 ]} FUNCNAME là một mảng chứa tất cả tên của các chức năng trong các cuộc gọi stack, vì vậy:

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

foo() { 
     echo ${FUNCNAME[ 0 ]} # prints 'foo' 
     echo ${FUNCNAME[ 1 ]} # prints 'bar' 
} 
bar() { foo; } 
bar 
Các vấn đề liên quan