シェルスクリプトでログを出力する際などに、自身の関数名を取りたい時がある。
その場合は ${FUNCNAME[0]}
を使用すれば良い。
また ${FUNCNAME[1]}
では呼び出し元の関数名を知ることも出来る。
test.sh
# !/bin/bash
echo $0
func_hoge() {
echo 'func_hoge(): ${FUNCNAME[0]} = '${FUNCNAME[0]}
echo 'func_hoge(): ${FUNCNAME[1]} = '${FUNCNAME[1]}
}
func_fuga() {
func_hoge
echo 'func_fuga(): ${FUNCNAME[0]} = '${FUNCNAME[0]}
echo 'func_fuga(): ${FUNCNAME[1]} = '${FUNCNAME[1]}
}
func_fuga
echo 'main: ${FUNCNAME[0]} = '${FUNCNAME[0]}
echo 'main: ${FUNCNAME[1]} = '${FUNCNAME[1]}
実行結果
$ bash test.sh
test.sh
func_hoge(): ${FUNCNAME[0]} = func_hoge
func_hoge(): ${FUNCNAME[1]} = func_fuga
func_fuga(): ${FUNCNAME[0]} = func_fuga
func_fuga(): ${FUNCNAME[1]} = main
main: ${FUNCNAME[0]} =
main: ${FUNCNAME[1]} =
func_fugaの呼び出し元は $0
の結果ではなく、main
になる様子。
しかしながら関数外で直接 ${FUNCNAME[0]}
を見た場合は main
ではなく空文字列が返った。