16

複雑な bash スクリプトを作成するときは、次のコマンドをよく使用します。

set -x

スクリプトが動作していない場合にスクリプトをデバッグできるようにします。

ただし、デバッグモードで大量のガベージを生成するUI関数がいくつかあるため、次の行に沿って条件付きでラップしたいと思います。

ui~title(){
    DEBUG_MODE=0
    if [ set -x is enabled ] # this is the bit I don't know how to do
    then
        # disable debugging mode for this function as it is not required and generates a lot of noise
        set +x
        DEBUG_MODE=1
    fi

    # my UI code goes here

    if [ "1" == "$DEBUG_MODE" ]
    then
        # re enable debugging mode here
        set -x
    fi
}

問題は、デバッグ モードが有効かどうかを知る方法がわからないことです。

可能だと思いますが、いくら探しても見つからないようです。

ヒントを事前にありがとう

4

3 に答える 3

27

以下を使用します。

if [[ "$-" == *x* ]]; then
  echo "is set"
else
  echo "is not set"
fi

3.2.5から。特殊パラメータ:

ハイフンは、呼び出し時に set 組み込みコマンドによって指定された現在のオプション フラグ、またはシェル自体によって設定されたもの (-i など) に展開されます。

于 2013-05-17T09:19:00.453 に答える
9
$ [ -o xtrace ] ; echo $?
1
$ set -x
++ ...
$ [ -o xtrace ] ; echo $?
+ '[' -o xtrace ']'
+ echo 0
0
于 2013-05-17T09:15:31.477 に答える
1

完全を期すために、再利用可能な 2 つの関数を次に示します。

is_shell_attribute_set() { # attribute, like "x"
  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 -x
if is_shell_attribute_set e; then echo "yes"; else echo "no"; fi # yes

set +x
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 # no

set +o pipefail
if is_shell_option_set pipefail; then echo "yes"; else echo "no"; fi # no
于 2016-01-10T18:32:38.623 に答える