bash: "-x" エコーから別の行をエスケープします。

bash:

Bashで-xこのオプションを使用すると、単一コマンドのエコーを省略できますか?

出力をできるだけきれいに保ちようとしているので、スクリプトの一部をサブシェルで実行しますset +x。ただし、行set +x自体はまだエコーされ、出力に重要な情報を追加しません。

以前は.batランタイムを使用したecho onとき@。 Bashにも同様のことがありますか?

#!/bin/bash -x

function i_know_what_this_does() {
  (
    set +x
    echo do stuff
  )
}

echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on

上記のコマンドを実行すると、出力は次のようになります。

+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on

ベストアンサー1

xtrace出力はstderrに移動するため、次にstderrリダイレクトできます/dev/null

i_know_what_this_does() {
  echo do stuff
} 2> /dev/null

関数内で実行されているコマンドのエラーを確認するには、次の手順を実行します。

i_know_what_this_does() (
  { set +x; } 2> /dev/null # silently disable xtrace
  echo do stuff
)

(...)代わりに使用すると、{...}サブシェルを介して関数にローカルスコープが提供されます。bashバージョン4.4では、Almquistシェル(Almquistシェルに似ています)のように、関数のローカルオプションとしてオプション設定をサポートするようになりましたlocal -set -o localoptionszsh

i_know_what_this_does() {
  { local -; set +x; } 2> /dev/null # silently disable xtrace
  echo do stuff
}

4.0から4.3への代替案は、変数をbash使用し、$BASH_XTRACEFD専用ファイル記述子を開くことです。/dev/null

exec 9> /dev/null
set -x
i_know_what_this_does() {
  { local BASH_XTRACEFD=9; } 2> /dev/null # silently disable xtrace
  echo do stuff
}

bashfdを表示する能力が不足しているため実行時に閉じるフラグですが、これはfdを他のコマンドに流す副作用があります。

これも見てくださいlocvar.sh実装されるいくつかの機能が含まれています。地元のPOSIXスクリプトの変数と関数の範囲、およびそれらを生成するためのtrace_fn関数も提供されています。untrace_fnディーデンかどうか。

おすすめ記事