假设我有一个bash脚本文件config.sh
。它的作用是被其他脚本调用,定义的变量被用作上层脚本的自定义。
问题在于,如果config.sh
有一个临时变量,而其名称与上层脚本的变量冲突,它会破坏上层脚本的变量。
config.sh:
TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
高层脚本:
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
这样做很麻烦,而且让代码难以阅读,除此之外也无法完美解决问题。
Solution 2 使用 local
关键字
经过一些搜索,我了解到了 local
关键字。
但是当我将 TMP1
声明为 local
时,bash会报错:config.sh: line 1: local: can only be used in a function
。
因此,我的另一个解决方案是将整个配置脚本包装成一个函数:
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一样存在一些可能会发生冲突的情况。
问题
我想知道更加健壮和智能的解决方案,而且没有任何可能发生冲突的情况。
谢谢。
ssh-agent
使用类似的技术,使用-c
和-s
选项。 - jjlinkeychain
不是我第一次看到它的地方,但这是我找到文档的第一个地方。:)有趣的是,在ssh-agent
手册中就在那里摆着... - sarnold