如何列出当前 shell 的 Bash 选项?

如何列出当前 shell 的 Bash 选项?

Bash 解释器本身有选项。

例如,第 22-23 行提到的那些Bash 的手册页:

选项
set 内置命令描述中记录的所有单字符 shell 选项都可以在调用 shell 时用作选项。此外,bash 在调用时会解释以下选项:
-c ...
-i ...
-l ...
-r ...

我在 Bash 的手册页中使用了一些搜索模式,例如:

  • /^\s*set
  • /list

是否可以打印应用于当前 shell 的这些设置的列表?

答案1

printf %s\\n "$-"

将在单个字符串中列出单个字母选项。

该参数也可以这样使用:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

首先禁用 shell文件名扩展,同时保存- 如果有 - in-f的值。接下来,不会发生任何 glob,并且最后的文件名扩展再次启用,也可能禁用。$-$1+f

例如,如果首次保存-f的值时已禁用文件名扩展$-,则其保存的值将为(至少):

f

因此,当set再次运行时,结果是:

set +f -f

这只会让你回到起点。

set +o

将列出所有set表外壳选项(看杰森的回答对于shopt有能力的人 - 这是一个词吗? - 选项)以对 shell 重新进入安全的形式。这样,您还可以执行以下操作:

state=$(set +o)
set -some -crazy -options
eval "$state"

分别保存、更改和恢复 shell 选项的状态。

要一次性处理shopt离子和表选项:set

state=$(set +o; shopt -p) 
#do what you want with options here
eval "$state"

您也可以致电set 没有用于添加 shell 当前设置的所有变量的列表的任何参数 - 也可以引用以重新进入 shell。您还可以在 bash 中另外添加该命令typeset -fp以包含所有当前声明的 shell 函数。准备好后,您可以将它们全部放在一起eval。您甚至可以alias不带参数地调用更多相同的内容。不过,这……可能会掩盖它。我想有-我想,在执行之前,"$@"您必须先将其放入数组中。bashset

不,还有trap。这个有点好笑。通常:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

...只会打印这是我的子shell因为子 shell 是一个新进程,并且有自己的一组traps - 因此不会继承任何traps,而是继承其父进程明确忽略的那些 -(喜欢trap '' INT

然而:

trap 'echo this is my trap' 0
save_traps=$(trap)

trap当它是第一个时表现特别仅有的命令在命令替换子 shell 中运行,因为它将以引用的格式重现父 shell 当前设置的列表,traps以便安全地重新进入 shell。所以你可以这样做save_traps然后 set没有参数 - 以及已经提到的所有其余内容 - 几乎可以锁定所有 shell 状态。不过,您可能希望显式添加export -preadonly -p恢复原始 shell var 属性。

无论如何,这就足够了。

答案2

选项?:bash 中有三组选项。

  1. 由命令读取或设置的选项set
    (在手册中使用此命令LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash:)
    所有单字母选项:abefhkmnptuvxBCEHPT

    还有选项(没有等效的单个字母):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
    
  2. 由命令读取或设置的选项shopt
    (使用此命令阅读手册LESS=+/'shopt \[-pqsu\]' man bash':)
    该列表很长但很容易打印,使用:

    $ shopt -p
    

    或类似(但不等于):

    $ shopt
    
  3. 可以在 INVOCATION 上设置的选项:(
    手册命令LESS=+/'^INVOCATION' man bash:)

    所有set选项:

    bash -abefhkmnptuvxBCEHPT
    

    所有shopt选项

    bash -O option
    

    有些选项仅在调用 bash 时才有意义:

    bash -lirsDc
    

    并且,还有(长选项):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version
    

所有set一个字母选项 和-ri均印有$-

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

例如:

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

仅使用 shopt 报告调用 bash 作为登录 shell:

-l      Login
read with `shopt -p login_shell`

因此:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

该选项-n无法通过任何代码进行测试,因为它意味着:不执行任何代码。


打印选项

列出选项的最佳工具跑步shell 中,用set或 用 设定的值shopt是相同的shopt。列出设置选项:

shopt -o

其作用完全一样set -o。使用shopt -po可获得与 相同的结果set +o

列出商店选项:

shopt -p

您可以选择打印已设置shopt -ps或未设置的内容shopt -pu

以获得所有选项。尽可能多的长选项和-sDcINVOCATION 上的一些 ( ) 无法打印:

$ echo $-; shopt -p ; shopt -po

要将它们存储在变量中:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

该变量可用于设置所有选项:

$ eval "$storeoptions"

答案3

这一man:

shopt
...不带选项或使用 -p 选项时,将显示所有可设置选项的列表,并指示是否设置了每个选项。
shopt | grep "on$"

将打印所有启用选项的列表。

答案4

要检查特定选项:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi

相关内容