У мене є сценарій, який вимірює, як довго виконується деяка команда.
Для цього потрібна команда "real" 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, що на,$()конструкт отримує-xвихідний результат як частину отриманого значення. Не знаю, чи це "очікувана" поведінка чи помилка ... А може, саме нижня оболонка()всередині насправді дає-xвихід.