bash&変数を使用して「set」を使用するタイミングを決定しますか? [閉鎖]

bash&変数を使用して「set」を使用するタイミングを決定しますか? [閉鎖]

似たようなことをしてその理由を知りたいとき。

[ ${debug:=0} -gt 0 ] && set -x || set +x

条件がset -xアクティブかどうか。問題は、IFを最初に${debug}使用できないことです。set +xdebug=1

テストケース:

dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
d=0;dtest
d=1;dtest
d=0;dtest

誰かがこの質問をしたかどうかはわかりません。おそらくどの表現を使うべきかわかりません。

答え1

関数でxtraceをリセットする必要があります。

dtest(){
  [ "${d:=0}" -gt 0 ] && set -x
  var="abc"
  echo "${var}"
  set +x
}
d=0;dtest
d=1;dtest
d=0;dtest

またはサブシェルを使用してください。

dtest(){
  [ "${d:=0}" -gt 0 ] && set -x || set +x
  var="abc"
  echo "${var}"
}
d=0;(dtest)
d=1;(dtest)
d=0;(dtest)

答え2

これは私にとってうまくいきます。

set -x最初から無効になっており、d=0設定されません。

$ dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
$ d=0;dtest
abc

ここでは関数の中間に設定されており、最後の2つのコマンドがトレースに印刷されます。

$ d=1;dtest
+ var=abc
+ echo abc
abc

ここでは、set -x機能の最後の実行から適用され、機能の途中で無効になります。実行後、最後の2つのコマンドのトレースは印刷されませんset +x

$ d=0;dtest
+ d=0
+ dtest
+ '[' 0 -gt 0 ']'
+ set +x
abc

関数の最後に無条件トレースを無効にするには、ペアを追加する必要がありますset +x

または、変更が関数内でのみ適用されるようにするにはlocal -(現在のバージョンのBashでは)、$-変更する前に関数の先頭に値を手動で保存し、保存された値に基づいてトレース終了を設定/リセットすることもできます。値。サブシェルで関数を実行すると同様の効果がありますが、この場合、関数内の変数に対する変更も関数の外には見えません。

関連情報