我有一个函数,它运行几个命令,每个命令都需要一些时间才能完成。我在开始时添加了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