У меня есть скрипт, который измеряет, как долго выполняется какая-то команда.
Ему нужна «настоящая» time
команда, то есть двоичный файл, например, в /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!
Так это сработало.
Теперь давайте попробуем отладить это, добавив «-x» в командную строку bash:
$ 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
результат.