В bash, как получить текущий статус set -x?

Я хотел бы временно установить -x в моем script, а затем вернуться в исходное состояние.

Есть ли способ сделать это, не запустив новую подоболочку? Что-то вроде

echo_was_on=.......
... ...
if $echo_was_on; then set -x; else set +x; fi

Ответ 1

Вы можете проверить значение $-, чтобы просмотреть текущие параметры; если он содержит x, он был установлен. Вы можете проверить это так:

old_setting=${-//[^x]/}
...
if [[ -n "$old_setting" ]]; then set -x; else set +x; fi

Ответ 2

Или в случае case

 case $- in
   *x* ) echo "X is set, do something here" ;;
   * )   echo "x NOT set" ;;
 esac

Ответ 3

Вот многократно используемые функции, основанные на ответах @shellter's и @glenn jackman:

is_shell_attribute_set() { # attribute, like "e"
  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 -e
if is_shell_attribute_set e; then echo "yes"; else echo "no"; fi # yes

set +e
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 # yes

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

Обновление: для Bash test -o - лучший способ сделать то же самое, см. Ответ @Kusalananda.

Ответ 4

reset_x=false
if [ -o xtrace ]; then
    set +x
    reset_x=true
fi

# do stuff

if "$reset_x"; then
    set -x
fi

Вы тестируете опцию оболочки с -o теста -o (используя [ как выше или с test -o). Если установлена опция xtrace (set -x), set -x ее и установите флаг для дальнейшего использования.

В функции вы могли бы даже установить ловушку RETURN чтобы сбросить настройку, когда функция вернется:

foo () {
    if [ -o xtrace ]; then
        set +x
        trap 'set -x' RETURN
    fi

    # rest of function body here
}

Ответ 5

Также:

case $(set -o | grep xtrace | cut -f2) in
    off) do something ;;
    on)  do another thing ;;
esac

Ответ 6

менее подробный

[ ${-/x} != ${-} ] && tracing=1 || tracing=0