我想暂时设定-x在我的剧本,然后返回到原来的状态。
有没有办法做到这一点,但不启动新的子shell? 就像是
echo_was_on=.......
... ...
if $echo_was_on; then set -x; else set +x; fi
我想暂时设定-x在我的剧本,然后返回到原来的状态。
有没有办法做到这一点,但不启动新的子shell? 就像是
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的和@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的答案 。
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
}
也:
case $(set -o | grep xtrace | cut -f2) in
off) do something ;;
on) do another thing ;;
esac
更简洁
[ ${-/x} != ${-} ] && tracing=1 || tracing=0