使用“源”运行脚本时如何正确恢复设置?

Pet*_*etr 10 script bash bash-scripting

我正在编写一个需要使用 执行的脚本source,因为它的任务是修改环境。在脚本期间,我想使用set -e以便任何错误停止脚本。该脚本如下所示:

#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript
Run Code Online (Sandbox Code Playgroud)

问题是set -e在脚本完成后自然保持有效。set当脚本停止时(以任何方式 - 成功完成或出错),我如何确保更改的选项正确恢复到其先前的值?

Sep*_*rvi 13

该命令set +o将当前设置列为恢复相同状态的命令,例如

$ set +o
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
...
Run Code Online (Sandbox Code Playgroud)

如果将此输出保存到 shell 变量,则稍后可以轻松恢复所有选项:

SAVED_OPTIONS=$(set +o)
set -e
# do something
eval "$SAVED_OPTIONS"
Run Code Online (Sandbox Code Playgroud)

Bash 还包括许多使用shopt命令调整的非标准(非 POSIX)选项。该命令shopt -p可用于以类似方式保存这些选项。

如果你只想保存和恢复一个选项,你可以使用 $- 环境变量,它将当前的一组选项列为字母,例如

$ echo $-
himBH
Run Code Online (Sandbox Code Playgroud)

你可以使用这样的东西来保存和恢复一个特定的选项:

[[ $- = *e* ]]
SAVED_ERREXIT=$?
set -e
# do something
(( $SAVED_ERREXIT )) && set +e
Run Code Online (Sandbox Code Playgroud)


daw*_*wud 3

与激活它的方式完全相同:调用 buitin set

$ set -o errexit
$ set -o | grep errexit
errexit         on
$ set +o errexit
$ set -o | grep errexit
errexit         off
Run Code Online (Sandbox Code Playgroud)

bash(1)联机帮助页的SHELL BUILTIN COMMANDS“set”命令部分下:

-o option-name
The option-name can be one of the following:
    errexit Same as -e.
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法保存(所有)这些设置并在以后恢复它们? (4认同)