Исходный код базовой системы 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
делает это для локальных файлов.
Поскольку вы используете источник сценария, измените 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
возвращает не -ноль только тогда, когда он не может записать в стандартный вывод (или указанный дескриптор файла ), у вас есть бесконечный цикл , потому что вы не проверяете статус выхода скрипта.ш! &>
не идиоматично :использовать >& file
или более очевидно >file 2>&1
.