环境: GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin20)
我试图捕获另一个函数的退出,然后继续执行程序。在面向对象的语言中,您可以捕获异常,然后继续执行而无需重新抛出;这基本上就是我想要做的。我期待这个函数foo()
,exit
但在这种情况下,我想抓住它并继续执行程序。
#!/bin/bash
function doNotExitProgram()
{
echo "Ignoring EXIT"
# Magic happens here
}
trap doNotExitProgram EXIT
function foo()
{
echo "Inside foo()"
exit 170
}
foo
echo "Continue execution here"
预期的:
里面 foo()
忽略 EXIT
在这里继续执行
实际的:
在 foo() 内部
忽略 EXIT
到目前为止尝试的步骤:
尝试使用
shopt -s extdebug
,但这似乎不适用于 EXIT。trap - EXIT
在里面试过doNotExitProgram()
尝试
trap - EXIT
返回return 0
内部doNotExitProgram()
尝试
trap - EXIT
返回return 1
内部doNotExitProgram()
return 0
在里面试过doNotExitProgram()
return 1
在里面试过doNotExitProgram()
trap "" EXIT
在里面试过doNotExitProgram()
编辑:如果可能的话不要改变foo()
使用
x
选项 (bash -x file
):trap doNotExitProgram EXIT
doNotExitProgram
调用时发生调用exit
。调用时foo
,执行doNotExitProgram
。exit
完成脚本执行所以不执行echo "Continue execution here"
。解决:
结果:
有
x
选项:您可以在子shell 中设置陷阱。将输出预期值。
或使用辅助功能:
您可以添加一个名为 的分支函数
catchExitCode
。缺点是如果其他可执行文件返回,它可能会被劫持170
。通过唯一的退出代码,它可以分支逻辑。