В Bash вы можете установить -x для включения отладки, есть ли способ узнать, было ли это установлено или нет в script?

При создании сложных скриптов bash я часто использую команду:

установить -x

чтобы я мог отлаживать script, если он не ведет себя.

Однако у меня есть некоторые функции пользовательского интерфейса, которые генерируют много мусора в режиме отладки, поэтому я хотел бы обернуть их в условное выражение по строкам:

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
}

Проблема в том, что я не могу понять, как узнать, включен ли режим отладки или нет.

Я предполагаю, что это возможно, я просто не могу найти его, несмотря на множество поисков.

Спасибо заранее за любые советы

Ответы

Ответ 1

Используйте следующее:

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

От 3.2.5. Специальные параметры:

Дефис расширяется до текущих флажков опций, как указано при вызове, встроенной командой set или той, которая установлена ​​самой оболочкой (например, -i).

Ответ 2

$ [ -o xtrace ] ; echo $?
1
$ set -x
++ ...
$ [ -o xtrace ] ; echo $?
+ '[' -o xtrace ']'
+ echo 0
0

Ответ 3

Как раз для полноты, вот две повторно используемые функции:

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