似たようなことをしてその理由を知りたいとき。
[ ${debug:=0} -gt 0 ] && set -x || set +x
条件がset -x
アクティブかどうか。問題は、IFを最初に${debug}
使用できないことです。set +x
debug=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では)、$-
変更する前に関数の先頭に値を手動で保存し、保存された値に基づいてトレース終了を設定/リセットすることもできます。値。サブシェルで関数を実行すると同様の効果がありますが、この場合、関数内の変数に対する変更も関数の外には見えません。