Ярлыки

Bash (2) Linux (2) Books (1) Debugging (1) Qt (1) api design (1)

вторник, 28 сентября 2010 г.

Знакомство с Bash

Не так давно судьба заставила перебраться на линукс, выбор коего пал на Kubuntu по соображениям лени. А так же потребовалось поднять CI систему на этом самом линуксе. Решено использовать с этой целью бbash. Пусть я и забиваю гвозди микроскопом, но зато много чего нового в этом деле можно выучить.

Итак задача:
Собирается много юнит тестов. Каждый набор тестов -- это исполняемый файл, каждый файл лежит в своем каталоге.
Надо: написать скрипт для bash, который прогонит все тесты и подведет итог о результатах.

Собственно решение подвернулось следующее:
1) ищем все исполняемые файлы
2) все их выполняем и складываем возвращаемые значения (получим количество проваленных тестов. Не обязательно, но мне захотелось)
3) выводим результат. Если ненулевой, то пора паниковать, иначе -- все хорошо.

Пока получилось вот что:

files=$(find ./tests/ -executable -type f)

echo '************************'
echo '** executables to run **'
echo '************************'
echo

for x in $files;
    do
    echo $x
    done

echo
echo '*********************'
echo '** start execution **'
echo '*********************'
echo


result=$((0))
for x in $files;
    do
    $x
    result=$(($result+$?))
    echo
    done

if [ "$result" != "0" ]
then
    echo **********
    echo ** FAIL **
    echo **********
else
    echo
    echo '*************************'
    echo '******** PASSED *********'
    echo '*************************'
echo
fi
exit $result


итак по пунктам:
files=$(find ./tests/ -executable -type f)
создаем переменную files и записываем в нее вывод метода find.
параметры find:
./tests/ -- искать в папке ./tests/
-executable -- исполняемый файл
-type f -- указываем, что искать надо файлы

result=$((0))
for x in $files;
do
$x
result=$(($result+$?))
echo
done
Создаем счетчик result.
В цикле выполняем все найденные файлы.
Увеличиваем счетчик на значение возвращенное последним исполняемым файлом. Вот это самое '$?'.

if [ "$result" != "0" ]
then
    ...failed
else
    ...succeeded
fi
exit $result
Тут просто: выводим и возвращаем результат, для дальнейшего использования.

Вот примерно так. Надеюсь кому-нибудь поможет.

Читать дальше......