所以,我正在开发一个具有辅助函数的函数,如果直接调用它可能会导致问题或什么也不做。
我想要做的是确保在主函数调用这些函数时仅执行。
以下是我提出的一些示例函数来说明问题:
function testfunc() { echo "Main function: ${FUNCNAME[@]}" ; sleep 2 ; subfunc ; }
function subfunc() { [[ ${FUNCNAME[1]} =~ ^testfunc$ ]] && echo "Sub Function: ${FUNCNAME[@]}" || echo "Can't be called directly. :< ${FUNCNAME[@]}" ; }
因此,它使用的是FUNCNAME环境变量:http://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html
只要前一个函数正常退出,它就可以正常工作:
$ testfunc
Main function: testfunc
Sub Function: subfunc testfunc
$ subfunc
Can't be called directly. :< subfunc
当函数为Ctrl + C'd时出现问题。它无限期地保留在FUNCNAME变量中:
$ testfunc
Main function: testfunc
^C
$ subfunc
Sub Function: subfunc testfunc
$ subfunc
Sub Function: subfunc testfunc
这让我发疯了。我尝试使用内置的“调用者”并获得相同的结果,它似乎是根据FUNCNAME变量提取信息。
我可以用几个技巧来做我想要的...添加一个子函数检查的参数,设置子函数检查的变量,隐藏函数名称和别名函数并从中调用它主要功能......等。
这些都可以解决,我想确保它只在主函数运行后才被调用,并且已经设置了所有正确的变量。
希望有人可以为我阐明这一点,或者指出我想做我想做的事情的方法。感觉它可能是Bash中FUNCNAME变量的错误。 :其中
谢谢,所有。 :)
答案 0 :(得分:0)
使用trap
trap func_to_handle_crtlc 2
func_to_handle_crtlc()
{
# code to handle control+c
...
}
唯一的问题是如果你真的想要exit
脚本,你将不得不考虑一些事情:)