bash & 使用变量来决定何时使用“set”?

bash & 使用变量来决定何时使用“set”?

当我做类似的事情时,想确定为什么;

[ ${debug:=0} -gt 0 ] && set -x || set +x

无论条件set -x是否启用。问题是我无法先${debug}使用set +xIF 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 中运行该函数会产生类似的效果,但在这种情况下,对函数中变量的任何更改在其外部也不可见。

相关内容