16

在制作复杂的 bash 脚本时,我会经常使用命令:

set -x

如果脚本不正常,我可以调试它。

但是,我有一些 UI 函数会在调试模式下生成大量垃圾,因此我想将它们包装在一个条件中,如下所示:

ui~title(){
    DEBUG_MODE=0
    if [ set -x is enabled ] # this is the bit I don't know how to do
    then
        # disable debugging mode for this function as it is not required and generates a lot of noise
        set +x
        DEBUG_MODE=1
    fi

    # my UI code goes here

    if [ "1" == "$DEBUG_MODE" ]
    then
        # re enable debugging mode here
        set -x
    fi
}

问题是我不知道如何知道是否启用了调试模式。

我假设这是可能的,尽管进行了大量搜索,但我似乎无法找到它。

提前感谢您的任何提示

4

3 回答 3

27

使用以下内容:

if [[ "$-" == *x* ]]; then
  echo "is set"
else
  echo "is not set"
fi

3.2.5 开始。特殊参数

连字符扩展为调用时指定的当前选项标志,由 set 内置命令或由 shell 本身设置的那些(例如 -i)。

于 2013-05-17T09:19:00.453 回答
9
$ [ -o xtrace ] ; echo $?
1
$ set -x
++ ...
$ [ -o xtrace ] ; echo $?
+ '[' -o xtrace ']'
+ echo 0
0
于 2013-05-17T09:15:31.477 回答
1

只是为了完整起见,这里有两个可重用的函数:

is_shell_attribute_set() { # attribute, like "x"
  case "$-" in
    *"$1"*) return 0 ;;
    *)    return 1 ;;
  esac
}


is_shell_option_set() { # option, like "pipefail"
  case "$(set -o | grep "$1")" in
    *on) return 0 ;;
    *)   return 1 ;;
  esac
}

使用示例:

set -x
if is_shell_attribute_set e; then echo "yes"; else echo "no"; fi # yes

set +x
if is_shell_attribute_set e; then echo "yes"; else echo "no"; fi # no

set -o pipefail
if is_shell_option_set pipefail; then echo "yes"; else echo "no"; fi # no

set +o pipefail
if is_shell_option_set pipefail; then echo "yes"; else echo "no"; fi # no
于 2016-01-10T18:32:38.623 回答