检查当前 bash 详细程度

Check current bash verbosity

我知道可以使用 set -v 将 bash 设置为详细模式,但是我想编写一个即使从冗长的脚本。

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

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

有没有办法找到当前的冗长级别?

if [[ $- =~ v ]]; then 
  echo "verbose enabled"
else
  echo "verbose disabled"
fi

$-: Contains the current set of enabled options. See: help set

检查详细模式选项与检查任何其他 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}
}

根据您的功能及其用途,您可以使用 (..) 子 shell 限制选项更改的范围:

foo() (
  set +vx
  echo "not verbose"
)

set -v
foo
echo "still verbose"
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 陷阱,当函数 returns 时(在函数末尾,或通过显式 return声明)。