当我做类似的事情时,想确定为什么;
[ ${debug:=0} -gt 0 ] && set -x || set +x
无论条件set -x
是否启用。问题是我无法先${debug}
使用set +x
IF debug=1
。
测试用例:
dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
d=0;dtest
d=1;dtest
d=0;dtest
不确定是否有人问过这个问题,也许我不确定要使用的措辞。
答案1
您必须重置函数中的 xtrace。
dtest(){
[ "${d:=0}" -gt 0 ] && set -x
var="abc"
echo "${var}"
set +x
}
d=0;dtest
d=1;dtest
d=0;dtest
或者使用子shell:
dtest(){
[ "${d:=0}" -gt 0 ] && set -x || set +x
var="abc"
echo "${var}"
}
d=0;(dtest)
d=1;(dtest)
d=0;(dtest)
答案2
这对我来说效果很好。
set -x
一开始就被禁用,并且d=0
不会被设置:
$ dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
$ d=0;dtest
abc
在这里,它设置在函数的中间,最后两个命令打印在跟踪中:
$ d=1;dtest
+ var=abc
+ echo abc
abc
在这里,set -x
从函数的最后一次运行开始生效,并在函数的中间被禁用。运行后,不会打印最后两个命令的跟踪set +x
。
$ d=0;dtest
+ d=0
+ dtest
+ '[' 0 -gt 0 ']'
+ set +x
abc
如果您想在函数末尾无条件禁用跟踪,则必须添加对set +x
.
或者,要使更改仅在函数内部生效,您可以local -
在函数的开头使用(在当前版本的 Bash 中)或$-
在进行更改之前手动保存 的值,并根据保存的值设置/重置跟踪结尾。在子 shell 中运行该函数会产生类似的效果,但在这种情况下,对函数中变量的任何更改在其外部也不可见。