Я использую bash 4.4.19 (1) -релиз.
В начале моей программы я считывал значения конфигурации клиента из командной строки, файла (ов) конфигурации и среды (в порядке убывания приоритета). Я проверяю эти значения конфигурации в соответствии с внутренними определениями, отказывая, если требуемые значения отсутствуют или значения клиента не совпадают с принятыми регулярными выражениями. Этот подход является жестким требованием, и я застрял, используя для этого BASH.
Весь процесс настройки включает в себя анализ нескольких файлов YAML и занимает около секунды. Я хотел бы сделать это только один раз, чтобы сохранить производительность. По завершении все настроенные значения помещаются в глобальный ассоциативный массив, объявленный следующим образом:
declare -gA CONFIG_VALUES
Для доступа к этому массиву была написана базовая вспомогательная функция:
# A wrapper for accessing the CONFIG_VALUES array.
function get_config_value {
local key="${1^^}"
local output
output="${CONFIG_VALUES[${key}]}"
echo "$output"
}
Это прекрасно работает, когда все команды выполняются в одной оболочке. Это даже работает, когда функция get_config_value вызывается из дочернего процесса. Это нарушается, когда он вызывается из дочернего процесса, а значение в массиве содержит косые черты. Это приводит к ошибкам, таким как следующее (строка 156 «output =» $ {CONFIG_VALUES [$ {key}]} »):
config.sh: line 156: path/to/some/file: syntax error: operand expected (error token is "/to/some/file")
Это особенно неприятно, потому что кажется, что значение "path / to / some / file" просто отлично читает. После этого он просто решает объявить синтаксическую ошибку и падает, не отображая значение.
Я пытался обойти это, запустив поиск массива в подоболочке, зафиксировав синтаксический сбой и обнаружив нужное мне значение:
# A wrapper for accessing the CONFIG_VALUES array.
function get_config_value {
local key="${1^^}"
local output
if output="$(echo "${CONFIG_VALUES[${key}]}" 2>&1)"; then
echo "$output"
else
grep -oP "(?<=: ).*(?=: syntax error: operand expected)" <<< "$output"
fi
}
К сожалению, похоже, что BASH не позволит мне игнорировать подобную "синтаксическую ошибку". Я не уверен, куда идти отсюда (ну ... Питон, но я не могу принять это решение).
Есть идеи?