在 bash 中,`$-` 产生 `himBHs`,但 `i` 和 `s` 是无效选项——这是怎么回事?

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)

如Unix & Linux 答案中所述

$ 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 条目指出,$-包含与 无关的设置的内容setset

当前的选项集可以在 $- 中找到。

这是事实,但由于遗漏而令人困惑。

$-记录状态时,不需要使用 ,因为所有选项都已能够记录以用于重置

% 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)

gle*_*man 4

请注意,靠近顶部的 bash 手册页显示

选项

内置命令描述中记录的所有单字符 shell 选项(set包括-o)都可以在调用 shell 时用作选项。此外,bash在调用时解释以下选项:

继续描述-i-s(除了可能更知名的-c-l

另外”是那里的关键。

Bash 参考手册中的相关章节:

  • 调用 Bash:讨论bash -i选项(强制 shell 以交互方式运行)和bash -s选项。

  • 交互式外壳

  • 特殊参数:$-:解释含义$-

    扩展为调用时指定的当前选项标志、通过 set 内置命令或由 shell 本身设置的选项标志(例如选项-i

  • 设置内置:列出了可能出现在中的更多选项,例如$-,,,,-h(与您的示例相比)。-m-B-HhimBHs