set +x
印刷せずにbashで言うことができるかどうか誰かが知っていますか:
set -x
command
set +x
痕跡
+ command
+ set +x
しかし、それは単に印刷する必要があります
+ command
Bashはバージョン4.1.10(4)です。これはしばらくの間私を悩ませています-出力が無駄なset +x
行で乱雑になり、トレース機能がそれ程有用ではなくなります。
set +x
印刷せずにbashで言うことができるかどうか誰かが知っていますか:
set -x
command
set +x
痕跡
+ command
+ set +x
しかし、それは単に印刷する必要があります
+ command
Bashはバージョン4.1.10(4)です。これはしばらくの間私を悩ませています-出力が無駄なset +x
行で乱雑になり、トレース機能がそれ程有用ではなくなります。
回答:
同じ問題があり、サブシェルを使用しない解決策を見つけることができました。
set -x
command
{ set +x; } 2>/dev/null
set +x
このような成功したコマンドです
command
、このバリエーションが解決策です{ STATUS=$?; set +x; } 2>/dev/null
。その後$STATUS
、余暇に次のラインで検査してください。
{ set +x; } 2>&-
です。これは、/ dev / nullを指すのではなく、fd 2を完全に閉じます。一部のプログラムは、stderrに出力しようとしたときにそれをうまく処理しません。そのため、/ dev / nullは一般的に優れたスタイルです。しかし、シェルのset -x
トレースはそれをうまく処理するので、ここで完全に機能し、この呪文を少し短くします。
サブシェルを使用できます。サブシェルを終了すると、設定x
が失われます:
( set -x ; command )
( set -x \n command \n )
ように悪いのかはわかりませんset -x \n command \n set +x
。
cd
:親シェルの現在のディレクトリは変更されません。
私はこれに悩まされたときに、この問題の解決策を最近作りました:
shopt -s expand_aliases
_xtrace() {
case $1 in
on) set -x ;;
off) set +x ;;
esac
}
alias xtrace='{ _xtrace $(cat); } 2>/dev/null <<<'
これにより、次のようにxtraceを有効または無効にできます。ここでは、引数が変数に割り当てられる方法をログに記録しています。
xtrace on
ARG1=$1
ARG2=$2
xtrace off
そして、次のような出力が得られます。
$ ./script.sh one two
+ ARG1=one
+ ARG2=two
/dev/stdin
一部は必要ありませんが)。注意点として、スクリプトでエイリアス展開を有効にすると、望ましくない副作用が生じる可能性があります。
/dev/stdin
。非インタラクティブ環境ではエイリアスを定義するファイルをロードしないため、特定の副作用については知りません。どのような副作用がありますか?
set +x
妥協するのは(不可能ではないにしても)はるかに難しい。しかし、それは依然として優れた真っ直ぐな解決策です-おそらくこれまでのところ最良の解決策です。
これは、コードのブロックを囲み、終了ステータスを保持するいくつかのアイデアの組み合わせです。
#!/bin/bash
shopt -s expand_aliases
alias trace_on='set -x'
alias trace_off='{ PREV_STATUS=$? ; set +x; } 2>/dev/null; (exit $PREV_STATUS)'
trace_on
echo hello
trace_off
echo "status: $?"
trace_on
(exit 56)
trace_off
実行すると:
$ ./test.sh
+ echo hello
hello
status: 0
+ exit 56
status: 56
()
周りexit
は必要ないと思います。OK。たぶんの偏執的でなく、このコードは、一般的に使用されている場合、あなたは良い攻撃ベクトル持っている:再定義trace_on
とtrace_off
して実行されたコマンドを読み込みジェクトコードを。そのような「ユーティリティ」を単独で使用する場合、それは有益ですが、コードが他の人と一緒に使用される場合、そのような非標準化された関数の利点が欠点を上回るかどうかを考慮する必要があります。{ set +x; } 2>/dev/null
この構成は一般的に理解されており、終了ステータスも変更しないため、個人的には解決しました。
script.sh 2>&1 | grep -v 'set +x'