25

スクリプトで -x を一時的に設定してから、元の状態に戻したいと考えています。

新しいサブシェルを開始せずにそれを行う方法はありますか? 何かのようなもの

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

7 に答える 7

26

の値をチェックして$-、現在のオプションを確認できます。x が含まれている場合は、設定されています。次のように確認できます。

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

あなたになじみがない場合:${}上記はBash Substring Replacementであり、変数を取り、 では-ないものを何も置き換えずx、後ろだけを残しますx(x がない場合は何もしません)。

于 2013-01-28T15:10:14.913 に答える
11

またはケースステートメントで

 case $- in
   *x* ) echo "X is set, do something here" ;;
   * )   echo "x NOT set" ;;
 esac
于 2013-01-28T15:15:04.273 に答える
9

@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の回答を参照してください。

于 2016-01-10T18:30:40.987 に答える
3

また:

case $(set -o | grep xtrace | cut -f2) in
    off) do something ;;
    on)  do another thing ;;
esac
于 2013-01-29T01:17:11.547 に答える