コマンドの実行時間を測定するスクリプトがあります。
「bash-built-inにはフラグがないため」などの「実際の」time
コマンド、つまりバイナリが必要です。/usr/bin/time
-f
以下に、デバッグ可能な簡略化されたスクリプトを示します。
#!/bin/bash
TIMESEC=$(echo blah | ( /usr/bin/time -f %e grep blah >/dev/null ) 2>&1 | awk -F. '{print $1}')
echo ABC--$TIMESEC--DEF
if [ "$TIMESEC" -eq 0 ] ; then
echo "we are here!"
fi
「test.sh」として保存して実行します。
$ bash test.sh
ABC--0--DEF
we are here!
それでうまくいきました。
それでは、bashコマンドラインに「-x」を追加して、これをデバッグしてみましょう。
$ bash -x test.sh
++ echo blah
++ awk -F. '{print $1}'
+ TIMESEC='++ /usr/bin/time -f %e grep blah
0'
+ echo ABC--++ /usr/bin/time -f %e grep blah 0--DEF
ABC--++ /usr/bin/time -f %e grep blah 0--DEF
+ '[' '++ /usr/bin/time -f %e grep blah
0' -eq 0 ']'
test.sh: line 10: [: ++ /usr/bin/time -f %e grep blah
0: integer expression expected
「-x」を使用しているときにこのスクリプトが破損し、それがなくても正常に動作するのはなぜですか?
BASH_XTRACEFD
リダイレクトできますset -x
。
-x
onでは、$()
コンストラクトは-x
結果の値の一部として出力を含めているように見えます。それが「予想される」動作なのかバグなのかはわからない...または、()
実際に-x
出力を提供しているのは内部のサブシェルかもしれません。