我正在尝试编写一个使用bash函数nocasematch
而不更改选项的调用者设置.功能定义是:
is_hello_world() {
shopt -s nocasematch
[[ "$1" =~ "hello world" ]]
}
Run Code Online (Sandbox Code Playgroud)
在我打电话之前:
$ shopt nocasematch
nocasematch off
Run Code Online (Sandbox Code Playgroud)
叫它:
$ is_hello_world 'hello world' && echo Yes
Yes
$ is_hello_world 'Hello World' && echo Yes
Yes
Run Code Online (Sandbox Code Playgroud)
正如所料,但现在nocasematch
调用者已经改变:
$ shopt nocasematch
nocasematch on
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法使选项更改为函数本地?
我知道我可以检查返回值,shopt -q
但这仍然意味着函数应该记住这一点并在退出之前重置它.
che*_*ner 31
函数体可以是任何复合命令,而不仅仅是组命令({}
).使用子shell:
is_hello_world() (
shopt -s nocasematch
[[ "$1" =~ "hello world" ]]
)
Run Code Online (Sandbox Code Playgroud)
NoD*_*und 11
我知道这个帖子的日期是2012年,但您也可以执行以下操作(适用于Windows上的Git Bash 1.8.4,因此它适用于Linux):
function foobar() {
local old=$(shopt -p extglob)
shopt -s extglob
... your stuff here ...
eval "$old"
}
Run Code Online (Sandbox Code Playgroud)
该-p
选项只需打印shopt -s extglob
,如果extglob
是,否则shopt -u extglob
.
shopt -p
打印整个选项列表.
在shell函数...返回之后,将在执行恢复之前执行用RETURN陷阱指定的命令。
的
-p
[给禁用了javascript]选项将导致在可重用为输入的形式显示输出。
foobar() {
trap "$(shopt -p extglob)" RETURN
shopt -s extglob
# ... your stuff here ...
}
Run Code Online (Sandbox Code Playgroud)
进行测试
foobar() {
trap "$(shopt -p extglob)" RETURN
shopt -s extglob
echo "inside foobar"
shopt extglob # Display current setting for errexit option
}
main() {
echo "inside main"
shopt extglob # Display current setting for errexit option
foobar
echo "back inside main"
shopt extglob # Display current setting for errexit option
}
Run Code Online (Sandbox Code Playgroud)
测试
$ main
inside main
extglob off
inside foobar
extglob on
back inside main
extglob off
Run Code Online (Sandbox Code Playgroud)
变体:要重置所有购物选项,请将trap语句更改为:
trap "$(shopt -p)" RETURN
Run Code Online (Sandbox Code Playgroud)
变体:要重置所有设置的选项,请将trap语句更改为:
trap "$(set +o)" RETURN
Run Code Online (Sandbox Code Playgroud)
注意:从Bash 4.4开始,有一个更好的方法:使$-local。
变体:要重置所有set和所有shopt选项,请将trap语句更改为:
trap "$(set +o)$(shopt -p)" RETURN
Run Code Online (Sandbox Code Playgroud)
注意: set +o
等同于shopt -p -o
:
+ o 将当前选项设置以适合于作为实现相同选项设置的命令重新输入到Shell的格式写入标准输出。