gpt4 book ai didi

bash:定义一个对采购脚​​本不可见的文件局部变量

转载 作者:行者123 更新时间:2023-11-29 08:42:36 25 4
gpt4 key购买 nike

假设我有一个 bash 脚本文件 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

这很痛苦并且使代码难以阅读,而且也不完美。

解决方案 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一样存在一些冲突的可能性。

问题

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

谢谢。

最佳答案

我从 keychain 中学到的一个技巧实用程序正在使用一个程序构建一个可source 的文件,其中仅包含您要从程序中导出的变量。您可以修改您的脚本以回显您要设置的变量,然后从您的程序获取输出:

$ echo $FOO

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

我使用 echo FOO=bar 来模拟更大的脚本;您的程序可能涉及更多。重要的部分是您必须修改您的程序以输出您想要设置的变量和值,而不是仅仅设置它们。这使您可以决定公开哪些变量以及以另一个 shell 进程为代价将哪些变量保持私有(private)。

关于bash:定义一个对采购脚​​本不可见的文件局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9205000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com