Ошибка с установочным скриптом init.sh в среде bash 5
При запуске скрипта init.sh в среде BASH 5.1.8 (AlmaLinux 9.4, kernel 5.14.0-427.40.1) выполнение доходит до стадии
init.sh -> вызов функции install_zitadel -> вызов функции wait_api -> цикл while true -> вызов функции curl
и впадает в бесконечную рекурсию, т.к. в функции curl снова вызывается функция curl.
В выдаче на экран пишется строка "Waiting for Zitadel to become ready ", а ожидаемых (повторяемых) строк ". " и заключительной строки " done" не выдаётся.
К сравнению в среде BASH 4.2.46 (CentOS 7.9, kernel 3.10.0-1160) такой ошибки нет.
В чём причина ошибки и два метода устранения
Причина достаточно простая:
Происходит бесконечная рекурсия вызова переопределённой функции curl, содержащей вызов curl.
1-ый метод устранения ошибки:
Переименовать функцию curl в curlmod, т.е. в несовпадающее имя функции с командой curl.
А затем заменить все вызовы функции curl в тексте скрипта init.sh в следующих функциях:
wait_api
set_custom_login_text
create_new_project
create_new_application
update_settings
create_user_roles
find_admin_user
grant_user_role
create_service_user
create_service_user_secret
detele_admin_service_user
на вызов функции curlmod().
Фактически везде, кроме функции check_curl (там это не требуется, см. 2-ой метод), то ошибка пропадает.
2-ой метод устранения ошибки:
Переписать функцию curl таким образом, чтобы не происходила бесконечная рекурсия.
Более элегантное решение :) Кстати, в функции check_curl именно так и сделано.
Предлагаемый вариант функции curl:
curl() {
if [ "$SELF_SIGNED_CERT}" == "true" ]; then
command curl --cacert "./certs/zitadel.${DOMAIN}.crt" "$@"
else
command curl "$@"
fi
}
Вызов команды "command curl" проигнорирует переопределение функции curl и вызовет команду curl,
которую сможет найти в $PATH.
Почему не стоит использовать переопределение CURL с помощью команды $(which curl)?
Например, для команды $(which ls) в обоих рассматриваемых операционных системах возвращаемое значение:
> LS=$(which ls); echo $LS
alias ls='ls --color=auto' /usr/bin/ls
Т.е. в значение переменной CURL попадёт не только путь до команды curl, но и переопределение alias, а
в нём могут быть свои "особенности".
После применения метода 1 или 2 - работа скрипта init.sh происходит без ошибок.
Ошибка с установочным скриптом init.sh в среде bash 5
При запуске скрипта init.sh в среде BASH 5.1.8 (AlmaLinux 9.4, kernel 5.14.0-427.40.1) выполнение доходит до стадии
init.sh -> вызов функции install_zitadel -> вызов функции wait_api -> цикл while true -> вызов функции curlи впадает в бесконечную рекурсию, т.к. в функции curl снова вызывается функция curl.
В выдаче на экран пишется строка "Waiting for Zitadel to become ready ", а ожидаемых (повторяемых) строк ". " и заключительной строки " done" не выдаётся.
К сравнению в среде BASH 4.2.46 (CentOS 7.9, kernel 3.10.0-1160) такой ошибки нет.
В чём причина ошибки и два метода устранения
Причина достаточно простая:
Происходит бесконечная рекурсия вызова переопределённой функции curl, содержащей вызов curl.
1-ый метод устранения ошибки:
Переименовать функцию curl в curlmod, т.е. в несовпадающее имя функции с командой curl.
А затем заменить все вызовы функции curl в тексте скрипта init.sh в следующих функциях:
wait_api
set_custom_login_text
create_new_project
create_new_application
update_settings
create_user_roles
find_admin_user
grant_user_role
create_service_user
create_service_user_secret
detele_admin_service_user
на вызов функции curlmod().
Фактически везде, кроме функции check_curl (там это не требуется, см. 2-ой метод), то ошибка пропадает.
2-ой метод устранения ошибки:
Переписать функцию curl таким образом, чтобы не происходила бесконечная рекурсия.
Более элегантное решение :) Кстати, в функции check_curl именно так и сделано.
Предлагаемый вариант функции curl:
Вызов команды "command curl" проигнорирует переопределение функции curl и вызовет команду curl,
которую сможет найти в $PATH.
Почему не стоит использовать переопределение CURL с помощью команды $(which curl)?
Например, для команды $(which ls) в обоих рассматриваемых операционных системах возвращаемое значение:
Т.е. в значение переменной CURL попадёт не только путь до команды curl, но и переопределение alias, а
в нём могут быть свои "особенности".
После применения метода 1 или 2 - работа скрипта init.sh происходит без ошибок.