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


27

bash解释器本身具有选项,即

bash手册页的第22-23行:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

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

  • /^\s*set
  • /list

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

Answers:


26
printf %s\\n "$-"

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

该参数也可以像这样使用:

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

首先禁用shell -filename扩展,同时保存-in $-(如果有)的值$1。接下来,不会发生+f全局冲突,并且再次启用了上一个ilename扩展,并且可能也将其禁用了。

例如,如果在第一次保存-f的值时已经禁用ilename扩展$-,则其保存的值将是(至少)

f

因此,当set再次运行时,它可以执行以下操作:

set +f -f

这只是让您回到起点。

set +o

会列出所有set表shell选项(见杰森的回答shopt能-就是一个字-选项)的形式,是壳再入安全。这样,您还可以执行以下操作:

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

分别保存,更改和还原Shell选项的状态。

要一次性处理shopt离子和set工作台选项:

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

您也可以set 不带任何参数的情况下调用以添加外壳程序当前设置的所有变量的列表-也引用该变量重新输入到外壳程序中。而且,您可以-在bash中-另外添加命令typeset -fp以包括所有当前声明的shell函数。eval准备好后,您可以将它们全部合并。您甚至可以在alias不使用参数的情况下进行调用。那...可能会掩盖它。我想有"$@"- 我想您必须bash先将其放入数组中,然后再进行操作set

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

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

...将只打印这是我的子shell,因为该子shell是一个新进程,并获得了自己的traps 集,因此不会继承任何traps,但其父项已显式忽略的s (例如trap '' INT

然而:

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

trap当它是在命令替换子外壳程序中运行的第一个也是唯一的命令时,它的行为特别不同,因为它将traps以安全重新进入该外壳程序的格式重新生成当前设置的父外壳程序列表。因此,您可以执行save_traps然后 set不使用参数-以及所有其他已提及的参数-几乎可以锁定所有shell状态。不过,您可能要显式添加export -preadonly -p还原原始的shell var属性。

无论如何,就足够了。


谢谢,您的代码运行良好。因此,要获得所有选项的完整列表,您必须同时使用set +o shopt?(至于说shopt一个字,settable在手册页中使用了,所以shoptable对我
有用

@ user4668401-我认为可以做到。
mikeserv

TL; DR,但3行解决方案的+1000可以更改选项并将其“原样”放回原处。这正是创建脚本或复制/可粘贴指令时所需要的。
Balmipour

@mikeserv似乎在保存状态以包括离子时需要添加-p选项shopt,即state=$(set +o;shopt -p)
nkatsar

9

man页面:

shopt
...没有任何选项,或者带有-p选项,将显示所有可设置选项的列表,并指示是否设置了每个选项。
shopt | grep on

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


奏效了,谢谢。您知道这是否列出了set和均可设置的选项shopt吗?
the_velour_fog

@ user4668401不,set范围更广:请参见手册页条目
jasonwryan

并检查是否启用了单个选项:shopt <option>
kos 2015年

这将包括名称(即huponexit)中带有“ on”的选项。修复的简单方法是shopt | grep on$
Mike D

6

列出所有选项:

set -o

要检查特定选项:

set -o | grep <OPTION>

以option verbose为例:

$ set -o | grep verbose
verbose         off

6

选项?: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. :可能在调用中设置的选项
    (对于手动命令: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不能用任何代码进行测试,因为这意味着:不要执行任何代码。


列印选项

最好的工具列出的选项运行的外壳,无论是与设置者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"

1

要检查特定选项:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.