在bash,如何让一套-x的现状如何?(In bash, how to get the curren

2019-08-08 13:46发布

我想暂时设定-x在我的剧本,然后返回到原来的状态。

有没有办法做到这一点,但不启动新的子shell? 就像是

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

Answer 1:

您可以检查的价值$-查看当前选项; 如果它包含X,它被设置。 您可以检查就像这样:

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


Answer 2:

或在一个case语句

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


Answer 3:

以下是可重复使用的功能的基础上, @ shellter的和@glenn杰克曼的答案:

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

更新 :对于猛砸, test -o是一种更好的方式来完成相同的,看到@ Kusalananda的答案 。



Answer 4:

reset_x=0
if [ -o xtrace ]; then
    set +x
    reset_x=1
fi

# do stuff

if [ "$reset_x" -eq 1 ]; then
    set -x
fi

你测试与壳选项-o试验(使用[如上述或与test -o )。 如果xtrace选项设置( set -x ),然后取消它,并设置一个标志,以备后用。

在一个功能,你甚至可以设置了RETURN陷阱时,该函数返回重置设置:

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

    # rest of function body here
}


Answer 5:

也:

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


Answer 6:

更简洁

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


文章来源: In bash, how to get the current status of set -x?