Sagen wir, dass ich eine Bash-Skriptdatei config.sh
habe. Es sollte von anderen Skripten als Quelle verwendet werden, und die definierten Variablen werden zur Anpassung der Skripte auf höherer Ebene verwendet.
Das Problem ist, wenn config.sh
eine temporäre Variable hat und ihr Name mit der Variable auf der höheren Ebene in Konflikt steht, bricht die auf der höheren Ebene.
config.sh:
TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
Script auf der höheren Ebene:
TMP1=def
source config.sh
echo $TMP1
Das letzte echo
gibt abc
aus, nicht def
.
Lösung 1
Meine aktuelle Lösung besteht darin, einen zufälligen String an den temporären Variablennamen anzuhängen, um Konflikte fast unmöglich zu machen. z. B. :
TMP1_vFc9Uiew=abc
CONFIG_INPUT_DIR="$TMP1_vFc9Uiew"/in
CONFIG_OUTPUT_DIR="$TMP1_vFc9Uiew"/out
unset TMP1_vFc9Uiew
was schmerzhaft ist und den Code schwer lesbar macht, zusätzlich perfekt zu sein.
Lösung 2 mit dem local
-Stichwort
Nach einigen Recherchen habe ich das Stichwort local
kennengelernt. Aber wenn ich TMP1
einfach als local
deklariere, beschwert sich Bash, dass config.sh: Zeile 1: local: kann nur in einer Funktion verwendet werden
.
Also ist meine andere Lösung, das gesamte Konfigurationsskript als Funktion zu umschließen:
function config_func_rZ0Yqkpm() {
local TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
}
config_func_rZ0Yqkpm
unset config_func_rZ0Yqkpm
was besser ist als die vorherige Lösung in Bezug auf Wartbarkeit und Lesbarkeit, aber auch eine gewisse Möglichkeit für Konflikte wie Lösung 1 besteht.
Frage
Ich möchte eine robustere und klügere Lösung kennen, ohne Möglichkeit für Konflikte.
Danke.