一時的にbashオプションの設定を解除する-x

一時的にbashオプションの設定を解除する-x

set -x私は何が起こっているのかを示すためにスクリプトでこれを使用するのが好きです。特に、スクリプトがCI / CDパイプラインで実行され、実際には後でいくつかのエラーをデバッグする必要があるかもしれません。

これに対する面倒なのは、一部のテキスト(ステータスメッセージなど)をユーザーに再エコーしたい場合は、"I'm starting to do $X"そのメッセージが2回出力されることです。一度はechoコマンド自体をエコーし​​、一度はechoそのコマンドの出力に出力します。

これをより良くするための良い方法はありますか? 1つの解決策は次のとおりです。

set -x

... bunch of normal commands that get echoed

(
  # Temporarily don't echo, so we don't double-echo
  set +x
  echo "Here is my status message"
)

... rest of commands get echoed again

しかし、これを行うと、2つの問題が発生します。

  1. ユーザーに何かを言いたいときはいつでも書くべき量が多く、毎回説明が必要なほど「明らか」ではありません。
  2. set +xまた、これは望ましくないことを反映しています。

うまく動作する他のオプションはありますか?

それはまるで@Makeの機能は、エコーを抑えるために前に追加することです。それでいいのですが、Bashではそのような機能が見つかりませんでした。

ベストアンサー1

Bashでは、次のようにこれを達成できます。いいえset -xキャプチャの代わりに使用DEBUGし、自己追跡を実行します。

#!/bin/bash

set -T

trap '! [[ "$BASH_COMMAND" =~ ^(echo|printf) ]] &&
      printf "+ %s\n" "$BASH_COMMAND"' DEBUG

foo=bar
echo This is a test
echo $foo
[[ $foo = bar ]] && /usr/bin/printf 'Matched\n'

アイデアは、その行の正規表現に無視したいコマンドを追加することですtrap。上記のコマンドを実行すると、次のようになります。

+ foo=bar
This is a test
bar
+ [[ $foo = bar ]]
+ /usr/bin/printf 'Matched\n'
Matched

set -Tトラップがシェル関数によって継承されていることを確認します。

トラップを有効または無効にする別のメカニズムを追加できます。例えばシェル変数を使用してください。

#!/bin/bash

set -T

status() {
        NOTRACE=1 echo "$@"
}

trap '! [[ "$BASH_COMMAND" =~ ^(status|NOTRACE=) ]] &&
      printf "+ %s\n" "$BASH_COMMAND"' DEBUG

foo=bar
test=$(echo baz)
echo This is a test
status This is a status report
echo $foo
[[ $foo = bar ]] && /usr/bin/printf 'Matched\n'

これは生産します

+ foo=bar
+ test=$(echo baz)
+ echo This is a test
This is a test
This is a status report
+ echo $foo
bar
+ [[ $foo = bar ]]
+ /usr/bin/printf 'Matched\n'
Matched

おすすめ記事