阻止函数直接在Bash中调用

时间:2015-08-05 00:49:13

标签: bash

所以,我正在开发一个具有辅助函数的函数,如果直接调用它可能会导致问题或什么也不做。

我想要做的是确保在主函数调用这些函数时执行。

以下是我提出的一些示例函数来说明问题:

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变量的错误。 :其中

谢谢,所有。 :)

1 个答案:

答案 0 :(得分:0)

使用trap

trap func_to_handle_crtlc 2

func_to_handle_crtlc()
{
  # code to handle control+c
  ...
}

唯一的问题是如果你真的想要exit脚本,你将不得不考虑一些事情:)