Last Modified:
Shellのset +xをxtraceで出さない方法 #Shell
#! /bin/sh
set -x
command
set +x
の場合に、
$ ./a.sh
+ command
+ set +x
となってset +x
が邪魔なのでどうにかしたいという話。
shell - Bash set +x without it being printed - Stack Overflow
によると{ set +x; } 2>/dev/null
で良いそうです。
ただ、そこにあるコメント
This zeroes the exit status. – Garth Kidd Jan 6 at 0:21
の通り、終了ステータスが0
(set +x
を実行した結果)になってしまってはやはり使いものにならない。
解決方法
いつものように$?
を一時保存してreturn
すればいい。
f()
{
set -x
command # xtrace
{ local r=$?; set +x; return $r; } 2>/dev/null
}
逆に元々set -x
されていて一時的に無効にしたい場合(例えば簡単なログ関数などでxtraceを出して欲しくない場合)は、
g()
{
{ set +x; } 2>/dev/null
command # NOT xtrace
{ local r=$?; set -x; return $r; } 2>/dev/null
}
とすればいい。
更にxtraceの設定を元に戻せるようにした最終形は以下の通り。
f()
{
{ local xtrace_=+x; test -o xtrace && xtrace_=-x; set -x; } 2>/dev/null
command # xtrace
{ local xtrace_r=$?; set $xtrace_; return $xtrace_r; } 2>/dev/null
}
g()
{
{ local xtrace_=+x; test -o xtrace && xtrace_=-x; set +x; } 2>/dev/null
command # NOT xtrace
{ local xtrace_r=$?; set $xtrace_; return $xtrace_r; } 2>/dev/null
}
ずいぶん冗長だけど。
おまけ:$BASH_XTRACEFD
xtraceの出力先はBASH_XTRACEFDで変更できます。
exec 3<>/tmp/a.xtrace
BASH_XTRACEFD=3
としておくと/tmp/a.xtraceに出力されます。しかしそこには忌まわしきset +x
が…。
単純に2>/dev/null
を${BASH_XTRACEFD:-2}>/dev/null
のようにしてもsyntax errorになってしまう。
これの解決方法は今のところわからず。