Cra*_*cks 5 bash posix-compliant
$ echo $-
himBHs
$ set -h
$ set -i
bash: set: -i: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
$ set -m
$ set -B
$ set -H
$ set -s
bash: set: -s: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Run Code Online (Sandbox Code Playgroud)
因此我无法使用此方法来恢复 bash 状态
oldstate="$(set +o); set -$-" # POSIXly store all set options.
.
.
set -vx; eval "$oldstate" # restore all options stored.
Run Code Online (Sandbox Code Playgroud)
$ bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic
Run Code Online (Sandbox Code Playgroud)
编辑/结论:正如下面的答案所示,尽管man 条目指出,$-
包含与 无关的设置的内容set
set
当前的选项集可以在 $- 中找到。
这是事实,但由于遗漏而令人困惑。
$-
记录状态时,不需要使用 ,因为所有选项都已能够记录以用于重置
% restoreState=$(shopt -po ; shopt -p)
Run Code Online (Sandbox Code Playgroud)
或更选择性地针对选项子集,例如
shopt -po | grep -E 'brace|glob' ; shopt -p | grep glob
Run Code Online (Sandbox Code Playgroud)
请注意,靠近顶部的 bash 手册页显示
选项
内置命令描述中记录的所有单字符 shell 选项(
set
包括-o
)都可以在调用 shell 时用作选项。此外,bash
在调用时解释以下选项:
继续描述-i
和-s
(除了可能更知名的-c
和-l
)
“另外”是那里的关键。
Bash 参考手册中的相关章节:
调用 Bash:讨论bash -i
选项(强制 shell 以交互方式运行)和bash -s
选项。
特殊参数:$-
:解释含义$-
:
扩展为调用时指定的当前选项标志、通过 set 内置命令或由 shell 本身设置的选项标志(例如选项
-i
)。
设置内置:列出了可能出现在中的更多选项,例如$-
,,,,-h
(与您的示例相比)。-m
-B
-H
himBHs