我知道可以使用set -v
将bash设置为详细模式,但是我想编写一个不以详细模式运行的函数,即使从详细脚本调用也是如此。
虽然我知道我可以通过在函数开头使用set +v
并以set -v
结束它来禁用详细程度,这意味着我的函数会将任何调用它的脚本设置为详细,即使它在调用之前没有冗长。
理想情况下,我会在函数开始时检查详细级别,禁用详细程度,并在函数结束时恢复详细程度更改。
有没有办法找到当前的详细级别?
答案 0 :(得分:3)
if [[ $- =~ v ]]; then
echo "verbose enabled"
else
echo "verbose disabled"
fi
$-
:包含当前启用的选项集。请参阅:help set
答案 1 :(得分:1)
if test -o verbose; then
echo 'shell is running in verbose mode'
else
echo 'shell is not running in verbose mode'
fi
或等同地
if [[ -o verbose ]]; then
echo 'shell is running in verbose mode'
else
echo 'shell is not running in verbose mode'
fi
test
中的内置bash
实用程序可以使用-o OPTION
测试是否设置了shell选项。请参阅交互式help test
shell中的bash
,或阅读有关bash
手册的内容。
您的功能可能看起来像
foo () {
if [[ -o verbose ]]; then
set +v
trap 'set -v' RETURN
fi
# do stuff
}
这将检测调用函数时-v
是否处于活动状态。如果是,则关闭它并且安装RETURN
陷阱,当函数返回时(在函数结束时,或通过显式return
语句)将再次将其重新打开。 / p>
答案 2 :(得分:0)
检查详细模式选项与检查任何其他bash选项相同,请参阅In bash, how to get the current status of set -x?。
试试这个:
func() {
local old_verbosity_level=${-//[^v]}
set +v
...
if [ -n "$old_verbosity_level" ]; then set -v; else set +v; fi
}
或者更棘手:
func() {
local old_verbosity_level=${-//[^v]}
set +v
...
${old_verbosity_level:+set -v}
}
答案 3 :(得分:0)
根据您的功能及其用法,您可以使用(..)
子shell限制选项更改的范围:
foo() (
set +vx
echo "not verbose"
)
set -v
foo
echo "still verbose"