Dire che ho un file di script bash config.sh
. È pensato per essere aggiunto ad altri script e le variabili definite vengono utilizzate come personalizzazione degli script di livello superiore.bash: definizione di una variabile file locale invisibile allo script di sourcing
Il problema è che se config.sh
ha una variabile temporanea e il suo nome è in conflitto con la variabile di script di livello superiore, si interrompe quella di livello superiore.
config.sh:
TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
sceneggiatura di livello superiore:
TMP1=def
source config.sh
echo $TMP1
Gli ultimi echo
stampe abc
, non def
.
Soluzione 1
La mia soluzione attuale è quella di aggiungere una stringa casuale per il nome della variabile temporanea per rendere quasi impossibile al conflitto. ad esempio:
TMP1_vFc9Uiew=abc
CONFIG_INPUT_DIR="$TMP1_vFc9Uiew"/in
CONFIG_OUTPUT_DIR="$TMP1_vFc9Uiew"/out
unset TMP1_vFc9Uiew
che è doloroso e rende il codice difficile da leggere, oltre a non essere perfetto.
Soluzione 2 utilizzando local
parola chiave
Dopo qualche ricerca, sono venuto a sapere local
parola chiave. Ma quando dichiaro semplicemente TMP1
come local
, bash si lamenta che config.sh: line 1: local: can only be used in a function
.
Quindi la mia un'altra soluzione è quella di racchiudere intero script di configurazione in funzione:
function config_func_rZ0Yqkpm() {
local TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
}
config_func_rZ0Yqkpm
unset config_func_rZ0Yqkpm
che è meglio che la soluzione precedente nella manutenibilità e la leggibilità, ma c'è qualche possibilità di entrare in conflitto così come la soluzione 1.
Domanda
Voglio conoscere una soluzione più robusta e intelligente senza alcuna possibilità di conflitto.
Grazie.
'ssh-agent' usa una tecnica simile, con le opzioni' -c' e '-s'. – jjlin
@jjlin: Grazie! Pensavo che 'keychain' non fosse esattamente il posto in cui l'ho visto per primo, ma era il primo posto in cui ho trovato la documentazione. :) Divertente, è seduto proprio lì all'aperto nella manpage di 'ssh-agent' ... – sarnold
@sarnold: Grande, grazie! Proverò questa tecnica. – niboshi