bash 解释器本身有选项,即
bash 手册页的第 22-23 行:
Run Code Online (Sandbox Code Playgroud)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 的这些设置的列表?
mik*_*erv 32
printf %s\\n "$-"
Run Code Online (Sandbox Code Playgroud)
将在单个字符串中列出单个字母选项。
该参数也可以像这样使用:
set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"
Run Code Online (Sandbox Code Playgroud)
首先禁用 shell-f
文件名扩展,同时为$-
- 如果有 - in保存一个值$1
。接下来,没有 globs 发生,最后一次+f
ilename 扩展再次启用,也可能禁用。
例如,如果首次保存-f
值时已禁用 ilename 扩展$-
,则其保存的值将是(至少):
f
Run Code Online (Sandbox Code Playgroud)
所以当set
再次运行时,它的结果是:
set +f -f
Run Code Online (Sandbox Code Playgroud)
这只是让你回到你开始的地方。
set +o
Run Code Online (Sandbox Code Playgroud)
将列出所有set
表 shell 选项(请参阅Jason对shopt
能力的回答- 这是一个词吗? - 选项)以对 shell 重新进入是安全的形式。这样,您还可以执行以下操作:
state=$(set +o)
set -some -crazy -options
eval "$state"
Run Code Online (Sandbox Code Playgroud)
分别保存、更改和恢复 shell 选项的状态。
一次性处理shopt
离子和set
表选项:
state=$(set +o;shopt)
#do what you want with options here
eval "$state"
Run Code Online (Sandbox Code Playgroud)
您也可以在set
不带任何参数的情况下调用以添加所有 shell 当前设置的变量的列表 - 也被引用以重新进入 shell。您可以 - 在 bash 中 - 另外添加命令typeset -fp
以包含所有当前声明的 shell 函数。你可以把它们放在一起,eval
准备好后。您甚至可以在alias
没有参数的情况下调用更多相同的内容。不过,那……可能会覆盖它。我想有"$@"
- 你必须先把它放在一个bash
数组中,我想,在做之前set
。
不,还有trap
。这个有点好笑。通常:
trap 'echo this is my trap' 0
(echo this is my subshell; trap)
Run Code Online (Sandbox Code Playgroud)
...将只打印这是我的子外壳,因为子外壳是一个新进程并获得自己的一组trap
s - 因此不会继承任何trap
s 而是其父级已明确忽略的那些 - (如trap '' INT
)。
然而:
trap 'echo this is my trap' 0
save_traps=$(trap)
Run Code Online (Sandbox Code Playgroud)
trap
当它是在命令替换子 shell 中运行的第一个也是唯一一个命令时,它的行为特别,因为它将以traps
引用的格式重新生成父 shell 当前设置的列表,以便安全地重新进入 shell。因此,您可以不加参数地执行save_traps
, then 操作 set
- 以及所有其他已经提到的 - 几乎可以锁定所有 shell 状态。不过,您可能希望显式添加export -p
和readonly -p
恢复原始的 shell var 属性。
不管怎样,这就够了。
jas*_*yan 13
从该man
页面:
shopt
...如果没有选项,或使用 -p 选项,将显示所有可设置选项的列表,并指示是否设置了每个选项。
shopt | grep "on$"
Run Code Online (Sandbox Code Playgroud)
将打印所有启用选项的列表。
小智 11
选项?:bash 中有三组选项。
命令读取或设置的选项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
Run Code Online (Sandbox Code Playgroud)命令读取或设置的选项shopt
。
(阅读手册用这个命令:LESS=+/'shopt \[-pqsu\]' man bash'
)
名单很长,但易于打印,使用:
$ shopt -p
Run Code Online (Sandbox Code Playgroud)
或类似(但不相等):
$ shopt
Run Code Online (Sandbox Code Playgroud):可能在调用中设置的选项
(对于手动命令:LESS=+/'^INVOCATION' man bash
)
所有set
选项:
bash -abefhkmnptuvxBCEHPT
Run Code Online (Sandbox Code Playgroud)
所有shopt
选项
bash -O option
Run Code Online (Sandbox Code Playgroud)
一些仅在调用 bash 时才有意义的选项:
bash -lirsDc
Run Code Online (Sandbox Code Playgroud)
而且,还有(长选项):
bash --debugger --help --init-file file --rcfile file --login \
--noediting --noprofile --norc --posix --restricted \
--verbose --version
Run Code Online (Sandbox Code Playgroud)所有set
一个字母选项,-ri
都印有$-
.
-i Interactive
Only read with `$-` (if it contains an `i`).
-r Restricted
Also read with `shopt -p restricted_shell
Run Code Online (Sandbox Code Playgroud)
例如:
$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri
Run Code Online (Sandbox Code Playgroud)
仅使用 shopt 报告将 bash 作为登录 shell 调用:
-l Login
read with `shopt -p login_shell`
Run Code Online (Sandbox Code Playgroud)
因此:
$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell
Run Code Online (Sandbox Code Playgroud)
该选项-n
不能被任何代码测试,因为它意味着:不执行任何代码。
列出正在运行的shell的选项的最佳工具,无论是设置的set
还是设置的shopt
都是相同的shopt
。列出设置选项:
shopt -o
Run Code Online (Sandbox Code Playgroud)
其作用与set -o
. 使用shopt -po
得到相同的结果set +o
。
列出 shopt 选项:
shopt -p
Run Code Online (Sandbox Code Playgroud)
您可以选择打印已设置shopt -ps
或未设置的shopt -pu
获取所有选项。尽可能多的长选项和-sDc
INVOCATION 上的一些 ( ) 不能打印:
$ echo $-; shopt -p ; shopt -po
Run Code Online (Sandbox Code Playgroud)
要将它们存储在变量中:
$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"
Run Code Online (Sandbox Code Playgroud)
并且该变量可用于设置所有选项:
$ eval "$storeoptions"
Run Code Online (Sandbox Code Playgroud)
小智 7
列出所有选项:
set -o
Run Code Online (Sandbox Code Playgroud)
要检查特定选项:
set -o | grep <OPTION>
Run Code Online (Sandbox Code Playgroud)
以选项verbose
为例:
$ set -o | grep verbose
verbose off
Run Code Online (Sandbox Code Playgroud)