在Bash shell中锁定“set +e”是什么意思?

3

有没有一种方法可以锁定Bash shell中的‘set +e’,使得调用‘set -e’的源脚本无法覆盖?

同时,子shell仍然能够‘set -e’。这种情况是否可行?

这是否可能实现?


1
你需要向我们展示更多关于这个“_sourced_”脚本如何被调用以及子shell在你的脚本中如何使用的上下文。 - Inian
这对我来说听起来不是一个好主意。显式设置set -e的脚本很可能是因为它们在某些情况下依赖它才能正常运行。事实上,一些脚本可能会在没有显式运行set的情况下也依赖于它。 - John Bollinger
我怀疑这是一个X-Y问题。你实际上想通过set +e完成什么任务? - John Bollinger
@JohnBollinger同意一般认为干扰脚本的预期工作流程是不好的做法。实际上,这归结于在将脚本源代码到一个不打算退出(通过源脚本)的shell中时,阻止errexit的作用。 - user1797455
1个回答

3

暂时使用函数覆盖内置的 set 命令:

#!/bin/bash

set() { [[ "$1" != "-e" ]] && command set "${@}"; }
# source your script here
unset set # if you want to use set -e again

哦,有趣。那么这个在shell中声明的“set”函数会在非源bash脚本调用的环境中持续存在吗? - user1797455
如果不调用unset set,则可以在脚本中多次使用该函数。但这并非万无一失,因为例如可以通过在您的源文件中使用set -x -e来绕过它。 - Cyrus
当然,想要克服这种对策的源脚本可以通过与函数本身使用相同的机制——command命令来轻松实现。它也可以自行unset该函数。 - John Bollinger
@Cyrus认为这个解决方案有其缺点,但是你引导了我正确的方向,所以谢谢!这就是我最终采用的代码:set() { command set "${@}"; setres=$? ; if [[ -o errexit ]] ; then set +e && echo "A process just attempted to 'set -e'" && false ; else return $setres ; fi } - user1797455

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接