Bash ' set -x '仅用于函数的持续时间



我有一个函数,它运行几个命令,每个命令都需要一些时间才能完成。我在开始时添加了set -x,这样我就可以准确地看到哪个命令正在执行。然后在最后我用set +x禁用它。

function toolong() {
set -x;
takes_a_long_time &&
takes_also_a_long_time && # <=== Hangs here, for example
takes_more time
set +x;
}

我的问题是,如果其中一个函数挂起或花费太长时间,有时我需要杀死我的进程。当这种情况发生时,我的壳里就剩下一堆垃圾,因为set +x从来没有被调用过。

是否有一种方法可以将set -x的范围限制在特定函数的持续时间内,或者保证set +x总是被调用?

如果您不需要影响当前的执行环境,只需在子shell中运行。

toolong() {
(
set -x;
takes_a_long_time &&
takes_also_a_long_time &&
takes_more time
)
}

或者更短的:

toolong() (
set -x;
takes_a_long_time &&
takes_also_a_long_time &&
takes_more time
)

设置toolong功能中断时进行清理的trap:

trap '[[ " ${FUNCNAME[*]} " == * toolong * ]] && set +x' INT

或者只是每次CtrlC输入

trap 'set +x' INT

最新更新