为了调试我的脚本,我想在每个输出的开头添加内部变量 $FUNCNAME 和 $LINENO,这样我就知道输出发生在哪个函数和行号上。
foo(){
local bar="something"
echo "$FUNCNAME $LINENO: I just set bar to $bar"
}
但由于会有很多调试输出,如果我可以执行如下操作会更干净:
foo(){
local trace='$FUNCNAME $LINENO'
local bar="something"
echo "$trace: I just set bar to $bar"
}
但上面的字面意思是输出:
“$FUNCNAME $LINENO:我只是为某事设置了障碍”
我认为这样做是因为双引号仅扩展内部变量一次。
是否有一种语法上干净的方法可以在同一行中将变量扩展两次?
你不能safely处理运行时数据时评估扩展两次。
有一些方法可以进行重新评估,但它们需要信任您的数据 - 在 NSA 系统设计的意义上:“受信任的组件是在系统发生故障时可以破坏系统的组件”。
See Bash常见问题解答 #48 http://mywiki.wooledge.org/BashFAQ/048进行详细讨论。请记住,如果您可以记录文件名,那么除 NUL 之外的任何字符可以出现在 UNIX 文件名中。$(rm -rf ~)'$(rm -rf ~)'.txt
是一个法定名称。*
是一个法定名称。
考虑一种不同的方法:
#!/usr/bin/env bash
trace() { echo "${FUNCNAME[1]}:${BASH_LINENO[0]}: $*" >&2; }
foo() {
bar=baz
trace "I just set bar to $bar"
}
foo
...当使用 bash 4.4.19(1)-release 运行时,会发出:
foo:7: I just set bar to baz
注意使用${BASH_LINENO[0]}
and ${FUNCNAME[1]}
;这是因为BASH_LINENO
定义如下:
一个数组变量,其成员是调用 FUNCNAME 的每个相应成员的源文件中的行号。
Thus, FUNCNAME[0]
is trace
, 然而FUNCNAME[1]
is foo
;然而BASH_LINENO[0]
是从哪条线开始trace
被调用——函数内部的一行foo
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)