Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 未清除bash$FUNCNAME数组_Arrays_Linux_Bash_Function_Debugging - Fatal编程技术网

Arrays 未清除bash$FUNCNAME数组

Arrays 未清除bash$FUNCNAME数组,arrays,linux,bash,function,debugging,Arrays,Linux,Bash,Function,Debugging,我有很多函数,它们经常相互嵌套。出于简单的调试目的,我决定使用bash提供的FUNCNAME环境变量数组来跟踪代码流。下面是示例代码: test1(){ test2;} test2(){ test3;} test3(){ test4;} test4(){ echo ${FUNCNAME[@]};} 输出如下所示: test4 test3 test2 test1 这非常清楚地显示了嵌套,但是如果您使用ctr+c终止函数并再次运行它,FUNCNAME不会刷新,因此输出可能如下所示(取决于您何时终

我有很多函数,它们经常相互嵌套。出于简单的调试目的,我决定使用
bash
提供的
FUNCNAME
环境变量数组来跟踪代码流。下面是示例代码:

test1(){ test2;}
test2(){ test3;}
test3(){ test4;}
test4(){ echo ${FUNCNAME[@]};}
输出如下所示:

test4 test3 test2 test1
这非常清楚地显示了嵌套,但是如果您使用
ctr+c
终止函数并再次运行它,
FUNCNAME
不会刷新,因此输出可能如下所示(取决于您何时终止它):


我试图手动清除或取消设置
FUNCNAME
,但结果是空输出。关于如何解决这个问题有什么想法吗?

有些人可能会说,这个问题是一个功能,而不是一个bug。如果堆栈中的任何函数崩溃,您可以
echo${funcname[@]}
查看崩溃发生在哪里。最后的结论是:该问题被报告为一个bug,并在
bash
v4.4.0中修复。

我在Debian Stable(bash 4.3.30)上进行了尝试,但无法重现该问题。你能提供更多细节吗:你使用的是什么操作系统和bash版本?你是如何计算ctrl-C的时间的?GNU bash,版本4.1.10(4)-发行版-(i686 pc cygwin),在每个函数中放入
sleep 2
,运行
test1
,几秒钟后终止,再次运行
test1
,输出将包含旧“链”的一部分。你是否在当前shell中运行你的脚本(即使用点正斜杠运行它)如下:
/script
?如果是这样,您将不断更新FUNCNAME变量…我可以复制;我认为这可能是一个bug。(我只对文件进行一次源代码提取,以定义四个函数;中断调用
test1
一次,然后再次调用完成,这表明
FUNCNAME
会累加。)但不清楚如何解决此问题。您不希望在信号中断调用后清除它,因为您可能希望在过早中断后检查值,这会让您在调用下一个函数时重置值。但如何确定哪些函数调用是“根”函数应该清除值的调用?(虽然我可能对
bash
内部结构太不熟悉,无法找到正确的方法。)
test4 test3 test2 test1 test3 test2 test1