LINUX.ORG.RU

Помощь с доработкой скрипта

 


0

1

Есть скрипт, который выводит результаты компиляции и компилирует соответственно. Мне нужно его модифицировать:

после окончания работы скрипта в выводе найти error и если фраза error есть, то заслать

throw new Exception('message')

и завершить работу скрипта

или если всё ок, то так же завершить работу скрипта

все операции с отправкой мессаги должны быть после mv

#!/bin/bash

cd /root/programming/ || exit

echo -e "\\n"

for sourcefile in /root/client_jenkins/workspace/test/*.cxx

do
        name="$(echo -n "$sourcefile" | sed 's/.*\///;s/\.cxx$//')"
        echo "$name"
        ./compiler "$sourcefile"
        echo -e "\\n"
done

mv -f /root/programming/*.so /root/programming/compiled

Суть всей доработки в том, чтобы прошли полностью все действия, вплоть до некорректной рекурсивной компиляции и в самом конце всех действий Jenkins'у было отправлено сообщение о том, что сборка завершилась некорректно - были ошибки и статус сборки должен измениться на build error

Пытаюсь разобраться с условным оператором, но программу вижу как-то так:

#!/bin/bash

cd /root/programming/ || exit

echo -e "\\n"

for sourcefile in /root/client_jenkins/workspace/test/*.cxx

do
        name="$(echo -n "$sourcefile" | sed 's/.*\///;s/\.cxx$//')"
        echo "$name"
        ./compiler "$sourcefile"
        echo -e "\\n" && echo -e >> compile_result
done

mv -f /root/programming/*.so /root/programming/compiled

grep -w "error" compile_result

if [$.. == error]
then
       throw new Exception('message')
       rm compile_result
else
        // is ok
        rm compile_result
fi
★★

Последнее исправление: BitSum (всего исправлений: 7)

Добавь переменную, после каждого действия делай [ $? -ne 0 ] && ISERROR=1, и если она после всех действий всё же 1, то не уведомляйся.

r3lgar ★★★★★
()

Что-то типа так:

#!/usr/bin/env bash

ISERROR=0

cd /root/programming/ || exit

echo -e "\\n"

for sourcefile in /root/client_jenkins/workspace/test/*.cxx

do
        name="$(echo -n "$sourcefile" | sed 's/.*\///;s/\.cxx$//')"
        echo "$name"
        ./compiler "$sourcefile"
        [ $? -ne 0 ] && ISERROR=1
        echo -e "\\n"
done

mv -f /root/programming/*.so /root/programming/compiled
[ $? -ne 0 ] && ISERROR=1

if [ $ISERROR -eq 0 ]; then
  echo "OK"
else
  echo "FAIL"
fi
Работоспособность не проверял, но ты разберёшься.

r3lgar ★★★★★
()
Ответ на: комментарий от vodz

/compiler «$sourcefile» || ISERROR=$?

А если ранее выдало ошибку? Так ты её сбрасываешь.

Ну приколисты...

Я весь код скопипастил из ОП, добавил только хандлер exitcode и заменил шебанг.

r3lgar ★★★★★
()
Ответ на: комментарий от r3lgar

Работоспособность не проверял, но ты разберёшься.

Принтует OK, хотя по ходу компиляции были error'ы.

BitSum ★★
() автор топика
Ответ на: комментарий от r3lgar

Да в том то и дело, что мне не совсем понятно, как такие условия в данном случае будут взаимодействовать с текстом

BitSum ★★
() автор топика
Ответ на: комментарий от BitSum
$ echo 1 | grep -qi 1
$ [ $? -eq 0 ] && echo "ok" || echo "fail"
ok
$ echo 2 | grep -qi 1
$ [ $? -eq 0 ] && echo "ok" || echo "fail"
fail
Deleted
()
Последнее исправление: MyLittleLoli (всего исправлений: 2)
Ответ на: комментарий от BitSum

мне не совсем понятно, как такие условия в данном случае будут взаимодействовать с текстом

После каждой команды проверяешь $? (exitcode), и если он не равен нулю (то есть произошла ошибка) (в этом случае нужно быть уверенным, что программа корректно обрабатывает ошибки, а не тупо выдаёт 0 даже при условии ошибки), то выставляешь хандлер-переменную (в случае удачи её не трогаешь, чтобы хандлить любую ошибку в процессе), а в конце всех действий проверяешь, не установлен ли твой хандлер в ошибку, и делаешь как тебе надо в зависимости от состояния хандлера.

r3lgar ★★★★★
()
Ответ на: комментарий от r3lgar

Нет никаких гарантий, что приложение выдаёт корректный exitcode.

Мдэ, вам не bash похоже надо учить, а логику вообще.

Код cmd; [ $? -ne 0 ] && err=1 и cmd || err=$? не только полностью эквивалентный, но даже лучше - в err будет последняя ошибка, а не только 1, да и синтаксическое дерево проще и быстрее. И для идиотов: при коде возврата 0 (без ошибок) выполняется '&& cmd2' как и в «[ ... ] && cmd2», где '[' и есть команда, может даже быть не встроенной в sh, а код после '||' - выполняется только при ненулевом коде возврата предыдущей команды. Обе комадны выполняются при «cmd1 ; cmd2» синтаксисе.

С вас 1 биткойн за разжевывания документации.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 3)
Ответ на: комментарий от r3lgar

После каждой команды проверяешь $? (exitcode), и если он не равен нулю

Какой ещё код выхода? Откуда он берётся?

У нас просто текст, ничего больше.

ПыСы

#!/bin/bash

cd /root/programming/ || exit

echo -e "\\n"

for sourcefile in /root/client_jenkins/workspace/test/*.cxx

do
        name="$(echo -n "$sourcefile" | sed 's/.*\///;s/\.cxx$//')"
        echo "$name"
        ./compiler "$sourcefile"
        echo -e "\\n" && echo -e >> compile_result
done

mv -f /root/programming/*.so /root/programming/compiled

IERROR=$(grep -w "error" compile_result)

if [[ IERROR == error ]]; then
        rm compile_result
        throw new Exception('message')
else
        rm compile_result
fi

С условиями только не разобрался ещё (я про if [[ IERROR == error ]]; then), зато сделал классную среду для работы с башем в Visual Code с shellcheck и shell debug.

BitSum ★★
() автор топика
Ответ на: комментарий от BitSum

Какой ещё код выхода? Откуда он берётся?

Код завершения работы команды ./compiler «$sourcefile»

У нас просто текст, ничего больше.

Это надо оговаривать отдельно и спокойно. Ибо в не «классной среде» так обычно не делается.

IERROR=$(grep -w «error» compile_result)
if [[ IERROR == error ]]; then

if grep -qw "error" compile_result ; then
  rm ...
fi
vodz ★★★★★
()
Ответ на: комментарий от vodz

Код завершения работы команды ./compiler «$sourcefile»

Увы, но компилятор настолько малофункциональный, что даже в данном случае он выводит текст и всё.

Это надо оговаривать отдельно и спокойно. Ибо в не «классной среде» так обычно не делается.

Приношу извинения, учту.

BitSum ★★
() автор топика
Ответ на: комментарий от vodz

С вас 1 биткойн за разжевывания документации.

Йа похош на хипстора? Не пользуюсь ни мобильными телефонами, ни этими вашими воздух-за-деньги.

Вообще, ты прав. Это я с перепоя-недосыпа попутал.

в err будет последняя ошибка, а не только 1

Какая разница, если у него там цикл? Тем более, ему надо хандлить наличие ошибки вообще, а не какой-то конкретной.

r3lgar ★★★★★
()
Последнее исправление: r3lgar (всего исправлений: 1)
Ответ на: комментарий от r3lgar

Какая разница, если у него там цикл?

Иногда это нужно, когда сообщение от самой программы невразумительное, а код - более информативен, но ошибки все одинаковые, скажем - нет прав записи в каталог, если развернули исходники от рута, а компилят от юзера.

vodz ★★★★★
()
Ответ на: комментарий от r3lgar

ему до этого ой как далеко…

Вы правы, но данный вопрос я обязательно изучу, а пока достиг желаемого результата:

#!/bin/bash

cd /root/programming/ || exit
touch result_compiler

echo -e "\\n"

for sourcefile in /root/client_jenkins/test/*.cxx

do
        name="$(echo -n "$sourcefile" | sed 's/.*\///;s/\.cxx$//')"
        echo "$name"
        ./compiler "$sourcefile" | tee -a result_compile
        echo -e "\\n"
done

mv -f /root/programming/*.so /root/programming/compiled

if grep -qw "error" result_compile; then
        rm result_compile

        printf "\\n ERROR BUILD!"

        job.CURRENT_BUILD
else
        rm result_compile
fi
BitSum ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.