我有一个脚本,可以测量某些命令的执行时间。
它需要“ real” time
命令,即,例如in中的二进制文件/usr/bin/time
(因为内置的bash没有该-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
输出的是子外壳。