检查当前的bash详细程度

时间:2018-06-03 10:51:52

标签: bash verbosity

我知道可以使用set -v将bash设置为详细模式,但是我想编写一个不以详细模式运行的函数,即使从详细脚本调用也是如此。

虽然我知道我可以通过在函数开头使用set +v并以set -v结束它来禁用详细程度,这意味着我的函数会将任何调用它的脚本设置为详细,即使它在调用之前没有冗长。

理想情况下,我会在函数开始时检查详细级别,禁用详细程度,并在函数结束时恢复详细程度更改。

有没有办法找到当前的详细级别?

4 个答案:

答案 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"
相关问题