bash:定义一个不可见的源文件的文件局部变量
发布时间:2020-12-15 19:14:58 所属栏目:安全 来源:网络整理
导读:说我有一个bash脚本文件config.sh。这意味着由其他脚本源代码,定义的变量被用作高级脚本的定制。 问题是,如果config.sh有一个临时变量,它的名称与上一级脚本的变量冲突,那么它会打破上级的变量。 config.sh: TMP1=abcCONFIG_INPUT_DIR="$TMP1"/inCONFIG
说我有一个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使用本地关键字 经过一番搜索,我来了解本地关键字。 所以我的另一个解决方案是将整个配置脚本作为一个函数: 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进程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |