Скажем, у меня есть файл bash script config.sh
. Это означало, что source'd использует другие сценарии, а определенные переменные используются как настройка сценариев верхнего уровня.
Проблема заключается в том, что если config.sh
имеет временную переменную и ее имя конфликтует с переменной верхнего уровня скрипта, она разбивает верхний уровень.
config.sh:
TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
верхний уровень script:
TMP1=def
source config.sh
echo $TMP1
Последний echo
печатает abc
, а не def
.
Решение 1
Мое текущее решение состоит в том, чтобы добавить случайную строку к временному имени переменной, чтобы сделать почти невозможным конфликт. например:
TMP1_vFc9Uiew=abc
CONFIG_INPUT_DIR="$TMP1_vFc9Uiew"/in
CONFIG_OUTPUT_DIR="$TMP1_vFc9Uiew"/out
unset TMP1_vFc9Uiew
что является болезненным и делает код трудным для чтения, кроме того, он не идеален.
Решение 2 с использованием ключевого слова local
После некоторого поиска я познакомился с ключевым словом local
.
Но когда я просто объявляю TMP1
как local
, bash жалуется, что config.sh: line 1: local: can only be used in a function
.
Итак, мое другое решение состоит в том, чтобы вставить всю конфигурацию script в качестве функции:
function config_func_rZ0Yqkpm() {
local TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
}
config_func_rZ0Yqkpm
unset config_func_rZ0Yqkpm
который лучше предыдущего решения в ремонтопригодности и удобочитаемости, но есть некоторая возможность конфликта, а также решение 1.
Вопрос
Я хочу знать более надежное и умное решение без каких-либо конфликтов.
Спасибо.