Как продолжить выполнение сценария, если сценарий, вызванный в первом сценарии, завершился с кодом ошибки?

Исходный код базовой системы OpenBSD и содержащихся в ней утилит доступен через CVS. Как получить исходный код, описано в FAQ по OpenBSD, в разделе Сборка OpenBSD из исходного кода . Это также описано на странице с описанием анонимного доступа к CVS :https://www.openbsd.org/anoncvs.html

.

Существует интерфейс для просмотра репозитория CVS, доступный непосредственно с домашней страницы OpenBSD :https://cvsweb.openbsd.org/, а также есть зеркало GitHub по адресуhttps://github.com/openbsd

Источник netstatдоступен в src/usr.bin/netstat .


В качестве общего комментария о поиске пакетов. :Рассмотрите возможность установки pkglocateиз портов. Он предоставляет утилиту pkglocate, которая позволяет вам искать файлы со всех доступных портов, точно так же, как locateделает это для локальных файлов.

1
24.11.2020, 05:03
1 ответ

Поскольку вы используете источник сценария, измените exit 1наreturn 1

Если вы также планируете запускать script.sh в качестве сценария «верхнего уровня», вы можете

if (( n == 42 )); then
    if [[ "$0" == "${BASH_SOURCE[0]}" ]]; then
        # I'm the "main" script
        exit 1
    else
        # I'm being sourced from some other script
        return 1
    fi
fi

Если вы должны использоватьsource(в этом я сомневаюсь, но мы должны увидеть код )и вы не можете изменить этот сценарий, тогда вы должны выполнить исходную команду в подоболочке. Это означает, что exitвыйдет из подоболочки, а не из вашей текущей оболочки, в которой запущена программа верхнего уровня :

.
i=0
#     /--------------------------------\  parentheses create a subshell
while (source script.sh >> log.txt 2>&1)
do
    ((i++))
done
echo "This error occurred after $i run(s)." >> log.txt

При этом создается файл журнала, содержащий:

Everything went according to plan
...
Everything went according to plan
Something went wrong
The error was using magic numbers
This error occurred after 302 run(s).

Несколько замечаний по вашему коду:

  • $[...]— недокументированный синтаксис, возможно, устаревший. Используйте $((...))для арифметического расширения или ((...))для арифметического вычисления.
  • $?— это статус выхода предыдущей команды , которая для 2-й итерации цикла while равна echo. Поскольку echoвозвращает не -ноль только тогда, когда он не может записать в стандартный вывод (или указанный дескриптор файла ), у вас есть бесконечный цикл , потому что вы не проверяете статус выхода скрипта.ш!
    • у вас есть примерно 1 из 100 шансов нажать Ctrl+C после состояния ошибки, поэтому в 99% случаев файл журнала будет содержать «хорошее» сообщение»
  • &>не идиоматично :использовать >& fileили более очевидно >file 2>&1.
  • вы, скорее всего, хотите напечатать сообщение "ошибка произошла после..." за пределами цикла
0
18.03.2021, 22:47

Теги

Похожие вопросы