printf %s\\n "$-"
将在单个字符串中列出单个字母选项。
该参数也可以像这样使用:
set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"
首先禁用shell -f
ilename扩展,同时保存-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是一个新进程,并获得了自己的trap
s 集,因此不会继承任何trap
s,但其父项已显式忽略的s (例如trap '' INT
)。
然而:
trap 'echo this is my trap' 0
save_traps=$(trap)
trap
当它是在命令替换子外壳程序中运行的第一个也是唯一的命令时,它的行为特别不同,因为它将traps
以安全重新进入该外壳程序的格式重新生成当前设置的父外壳程序列表。因此,您可以执行save_traps
,然后 set
不使用参数-以及所有其他已提及的参数-几乎可以锁定所有shell状态。不过,您可能要显式添加export -p
并readonly -p
还原原始的shell var属性。
无论如何,就足够了。
set +o
和shopt
?(至于说shopt
一个字,settable
在手册页中使用了,所以shoptable
对我