Я хотел бы временно установить -x в моем script, а затем вернуться в исходное состояние.
Есть ли способ сделать это, не запустив новую подоболочку? Что-то вроде
echo_was_on=.......
... ...
if $echo_was_on; then set -x; else set +x; fi
Я хотел бы временно установить -x в моем script, а затем вернуться в исходное состояние.
Есть ли способ сделать это, не запустив новую подоболочку? Что-то вроде
echo_was_on=.......
... ...
if $echo_was_on; then set -x; else set +x; fi
Вы можете проверить значение $-
, чтобы просмотреть текущие параметры; если он содержит x, он был установлен. Вы можете проверить это так:
old_setting=${-//[^x]/}
...
if [[ -n "$old_setting" ]]; then set -x; else set +x; fi
Или в случае case
case $- in
*x* ) echo "X is set, do something here" ;;
* ) echo "x NOT set" ;;
esac
Вот многократно используемые функции, основанные на ответах @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.
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
}
Также:
case $(set -o | grep xtrace | cut -f2) in
off) do something ;;
on) do another thing ;;
esac
менее подробный
[ ${-/x} != ${-} ] && tracing=1 || tracing=0