gpt4 book ai didi

shell - 如何在 shell 脚本中静默禁用 xtrace?

转载 作者:行者123 更新时间:2023-12-03 16:42:13 25 4
gpt4 key购买 nike

我正在编写一个 shell 脚本,它循环遍历一些值并为每个值运行一个长命令行。我想一路打印出这些命令,就像make运行 makefile 时会这样做。我知道我可以在运行它们之前“回显”所有命令,但这感觉不雅。所以我在看 set -x和类似的机制:

#!/bin/sh

for value in a long list of values
do
set -v
touch $value # imagine a complicated invocation here
set +v
done

我的问题是:在每次迭代中,不仅打印出 interresting 行,而且打印出 set +x线也是如此。是否有可能以某种方式防止这种情况发生?如果没有,您推荐什么解决方法?

PS:上面的MWE使用 sh ,但我也有 bashzsh安装以防万一。

最佳答案

在子shell中沙箱它:

(set -x; do_thing_you_want_traced)

当然,在该子shell 中对变量或环境所做的更改将丢失。

如果你真的关心这个,你也可以使用调试陷阱(使用 set -T 使其被函数继承)来实现你自己的 set -x相等的。

例如,如果使用 bash:
trap_fn() {
[[ $DEBUG && $BASH_COMMAND != "unset DEBUG" ]] && \
printf "[%s:%s] %s\n" "$BASH_SOURCE" "$LINENO" "$BASH_COMMAND"
return 0 # do not block execution in extdebug mode
}
trap trap_fn DEBUG

DEBUG=1
# ...do something you want traced...
unset DEBUG

也就是说,发出 BASH_COMMAND(作为调试陷阱可以做的)并不完全等同于 set -x ;例如,它不显示扩展后的值。

关于shell - 如何在 shell 脚本中静默禁用 xtrace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17365784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com