スクリプトで -x を一時的に設定してから、元の状態に戻したいと考えています。
新しいサブシェルを開始せずにそれを行う方法はありますか? 何かのようなもの
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
あなたになじみがない場合:${}
上記はBash Substring Replacementであり、変数を取り、 では-
ないものを何も置き換えずx
、後ろだけを残しますx
(x がない場合は何もしません)。
またはケースステートメントで
case $- in
*x* ) echo "X is set, do something here" ;;
* ) echo "x NOT set" ;;
esac
@shellterと@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の回答を参照してください。
また:
case $(set -o | grep xtrace | cut -f2) in
off) do something ;;
on) do another thing ;;
esac