在 bash 中 `$-` 产生 `himBHs` 但是 `i` 和 `s` 是无效选项——发生了什么?

在 bash 中 `$-` 产生 `himBHs` 但是 `i` 和 `s` 是无效选项——发生了什么?
$ 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 ...]

因此,我无法使用此方法恢复 bash 状态

oldstate="$(set +o); set -$-"                # POSIXly store all set options.
.
.
set -vx; eval "$oldstate"         # restore all options stored.

如本文所述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

编辑/结论:正如下面的答案通知,的内容$-包括与无关的设置set,尽管set手册条目指出

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

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

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

% restoreState=$(shopt  -po ; shopt -p)

或者更有选择性地选择一组选项,例如,

shopt  -po | grep -E 'brace|glob' ; shopt -p | grep glob

答案1

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

选项

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

并且继续描述-i-s(除了可能更为人熟知的-c-l

此外“这是关键所在。

相关章节Bash 参考手册

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

  • 交互式外壳

  • 特殊参数:$-:解释以下内容$-

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

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

相关内容