bash:定义一个不可见的源文件的文件局部变量

前端之家收集整理的这篇文章主要介绍了bash:定义一个不可见的源文件的文件局部变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
说我有一个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

最后一个回声打印abc,而不是def。

解决方案1

我目前的解决方案是将一个随机字符串附加到临时变量名称,使其几乎不可能发生冲突。例如:

TMP1_vFc9Uiew=abc
CONFIG_INPUT_DIR="$TMP1_vFc9Uiew"/in
CONFIG_OUTPUT_DIR="$TMP1_vFc9Uiew"/out
unset TMP1_vFc9Uiew

这是痛苦的,使代码难以阅读,另外不完美。

解决方案2使用本地关键字

经过一番搜索,我来了解本地关键字。
但是当我简单地将TMP1声明为本地时,bash抱怨config.sh:line 1:local:只能在一个函数中使用。

所以我的另一个解决方案是将整个配置脚本作为一个函数

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。

我想知道更强大和智能的解决方案,没有任何冲突的可能性。

谢谢。

keychain实用程序中学到的一个技巧是使用一个程序构建一个源代码文件,其中只包含要从程序导出的变量。您可以修改脚本以回显要设置的变量,然后从程序中输出输出
$ echo $FOO

$ source <(echo FOO=bar)
$ echo $FOO
bar
$

我使用echo FOO = bar来模拟较大的脚本;你的程序可能更多地涉及。重要的部分是您必须修改程序以输出要设置的变量和值,而不是设置它们。这允许您决定要暴露的变量以及哪些变量保持私有,但需要另外一个shell进程。

原文链接:https://www.f2er.com/bash/387766.html

猜你在找的Bash相关文章