我已经在各种堆栈交换站点和UNIX帮助论坛上通读了许多有关如何修改Shell选项然后恢复它们的问题-我在这里找到的最全面的解决方法是如何“撤消” set -x`?
在收到的智慧似乎是要么保存过的结果set +o或shopt -po再eval后来恢复到以前的设置。
但是,在我自己使用bash 3.x和4.x进行的测试中,errexit执行命令替换时未正确保存该选项。
这是显示问题的示例脚本:
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
和输出(我修剪掉了一些不相关的变量):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
这似乎非常危险。errexit如果有任何命令失败,我编写的大多数脚本都会停止执行。我只是在其中一个脚本中发现了一个由此引起的错误,该错误原本应该errexit在最后恢复,但此功能将覆盖它,并在脚本持续时间内将其设置为默认关闭状态。
我想做的是编写可以根据需要设置选项的函数,然后在退出之前正确还原所有选项。但是,似乎在命令替换调用的子外壳中,errexit是不会被继承的。
我不知道如何保存结果set +o而不使用命令替换或跳过FIFO箍。我可以阅读,$SHELLOPTS但不是可写或eval-able格式。
我知道一种替代方法是使用subshell函数,但是这给能够记录输出以及传递多个变量带来了很多麻烦。
可能相关:https : //stackoverflow.com/questions/29532904/bash-subshell-errexit-semantics(似乎有一个针对bash 4.4及更高版本的解决方法,但我宁愿有一个便携式解决方案)
shopt设置选项(如nullglob)。