这仅限于Bash,答案需要毫无例外地适用于所有Bash版本。
我现在就这么做:
op1
(set -x; op2)
op3它实现了我的预期:op1不是转录的,op2 是转录的,然后op3不是转录的。这具有这样的特性:如果发生“代码楔形”,op2有大量的文本行,我不必记得稍后调用set +x,因为使用括号的作用域。我不希望set +x也被转录,因为它扰乱了输出。
那么,如何在不显式调用set +x的情况下完成上述工作呢?我试过使用花括号,但它们不会像圆括号那样“撤消”set -x。
发布于 2020-12-10 19:00:28
除了在当前的bash4.x中使用了非默认的BASH_XTRACEFD特性之外,以下内容将很好地工作:
logged_cmd() {
local rc=0
set -x
"$@"
{ { rc=$?; set +x; }; } 2>/dev/null
return "$rc"
}
op1
logged_cmd op2
op3添加对正在使用BASH_XTRACEFD的情况的支持(使set -x日志转到stderr以外的其他地方)将需要使用bash 4.1+特性,这在问题中已被明确禁止。
https://stackoverflow.com/questions/65240414
复制相似问题