В 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