Skip to content

Ошибка с установочным скриптом init.sh в среде bash 5 #228

@dmitry-dubna

Description

@dmitry-dubna

Ошибка с установочным скриптом 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 происходит без ошибок.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions