我知道 bash 可以通过使用set -v
设置为详细模式,但是我想编写一个即使从详细脚本调用也不会以详细模式运行的函数。
虽然我知道我可以通过在函数开头使用set +v
并以set -v
结束它来禁用冗长,但这意味着我的函数会将任何调用它的脚本设置为详细,即使它在调用它之前并不冗长。
理想情况下,我会在函数开始时检查详细级别,禁用详细程度,并在函数结束时还原详细程度更改。
有没有办法找到当前的详细程度级别?
if [[ $- =~ v ]]; then
echo "verbose enabled"
else
echo "verbose disabled"
fi
$-
:包含当前启用的选项集。请参阅:help set
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
bash
中的内置test
实用程序能够使用-o OPTION
测试是否设置了 shell 选项。 请参阅交互式bash
shell 中的help test
,或者阅读有关它的信息是bash
手册。
您的函数可能如下所示
foo () {
if [[ -o verbose ]]; then
set +v
trap 'set -v' RETURN
fi
# do stuff
}
这将检测调用函数时-v
是否处于活动状态。如果是,则将其关闭并安装RETURN
陷阱,该陷阱将在函数返回时(在函数末尾或通过显式return
语句(再次打开它。
检查详细模式选项与检查任何其他 bash 选项相同,请参阅 在 bash 中,如何获取 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}
}
根据您的函数及其用法,您可以使用(..)
子壳来限制选项更改的范围:
foo() (
set +vx
echo "not verbose"
)
set -v
foo
echo "still verbose"