Вы хотите упростить код, используемый внутри рекурсивной функции.
Часть, которую вы хотите улучшить, — это захват кода выхода функции.
Следует понимать, что код возврата не единственный способ передачи информации. На самом деле, самый быстрый способ передачи информации — это переменная. В рекурсивной функции это должна быть глобальная переменная (, не определенная с помощью локальной ), чтобы родитель мог прочитать значение обратно. В этом случае строка, которая устанавливает код возврата 1, это
# return 1 (false) if $DEP_CHANGED = false && $DEP_FILE is cached
[ "$DEP_CHANGED" = false ] && (cached "$(dirname "$DEP_FILE")") && return 1
, который можно изменить на:
# Inform that data didn't change
[ "$DEP_CHANGED" = false ] &&
(cached "$(dirname "$DEP_FILE")") &&
dep_changed_in_function=false
И соответственно:
for DEP in "${DEP_LIST[@]}"; do
dep_changed_in_function=true
# find new deps
DEP_OUT=( "$(changes "$DEP" "${DEP_OUT[*]}" "${DEP_HIERARCHY[*]}")" )
DEP_OUT=( $(printf "%s\n" "${DEP_OUT[@]}" | sort | trim | uniq) )
# set $DEP_CHANGED flag
[ "$dep_changed_in_function" -eq true ] && DEP_CHANGED=true
done
Но второго вызова для обработки массива DEP_OUT
можно было бы легко избежать, если выходные данные changes
уже отсортированы.
Это можно легко сделать:
echo $(printf '%s\n' "${DEP_OUT[@]}" | sort | trim | uniq )
Вместо
echo "${DEP_OUT[@]}"
При этом часть кода из вашего вопроса сводится к:
for DEP in "${DEP_LIST[@]}"; do
dep_changed_in_function=true
DEP_OUT=( "$(changes "$DEP" "${DEP_OUT[*]}" "${DEP_HIERARCHY[*]}")" )
# set $DEP_CHANGED flag
DEP_CHANGED=$dep_changed_in_function
done
Конечно, dep_changed_in_function=true
можно установить в начале функции.
RPM зависят от распределения. Так, например, вы можете получить старые пакеты RPM для Fedora изhttps://archives.fedoraproject.org/pub/archive/fedora/linux/releases. Однако не все выпуски ядра будут доступны таким образом.
Если вам нужно конкретное ядро, может потребоваться поиск в архивах различных дистрибутивов RPM -.
В противном случае можно использовать официальный архив с kernel.org.