回答:
FUNCNAME
現在実行呼び出しスタックにあるすべてのシェル関数の名前を含む配列変数。インデックス0の要素は、現在実行中のシェル関数の名前です。一番下の要素(最高のインデックスを持つ要素)は「メイン」です。この変数は、シェル関数の実行中にのみ存在します。FUNCNAMEへの割り当ては効果がなく、エラーステータスを返します。FUNCNAMEが設定されていない場合、その後リセットされても、特別なプロパティは失われます。
この変数は、BASH_LINENOおよびBASH_SOURCEで使用できます。FUNCNAMEの各要素には、BASH_LINENOおよびBASH_SOURCEに対応する要素があり、呼び出しスタックを記述します。たとえば、$ {FUNCNAME [$ i]}はファイル$ {BASH_SOURCE [$ i + 1]}から行番号$ {BASH_LINENO [$ i]}で呼び出されました。組み込みの呼び出し元は、この情報を使用して現在の呼び出しスタックを表示します。
インデックスなしでbash配列にアクセスすると、配列の最初の要素が返されるため$FUNCNAME
、単純な場合に機能して、現在の関数の名前を提供しますが、呼び出しスタック内の他のすべての関数も含まれます。例えば:
# in a file "foobar"
function foo {
echo foo
echo "In function $FUNCNAME: FUNCNAME=${FUNCNAME[*]}" >&2
}
function foobar {
echo "$(foo)bar"
echo "In function $FUNCNAME: FUNCNAME=${FUNCNAME[*]}" >&2
}
foobar
出力されます:
$ bash foobar
In function foo: FUNCNAME=foo foobar main
foobar
In function foobar: FUNCNAME=foobar main
[0]
装飾されていない変数にアクセスすることで暗黙のifを追加するのはなぜですか?
${FUNCNAME[0]}
現在の関数名を出力するために使用します
(関数内から)関数名を取得する最も簡単な方法
echo $0
###
あなたの答えを悪用しないでください。
FUNCNAME
配列およびその他のBash変数を使用するBashロギングフレームワーク:github.com/codeforester/base/blob/master/lib/stdlib.sh。特に関数log_debug_enter
を参照してくださいlog_debug_leave
。