2013-05-10 51 views
0

我有一个通过环境变量提供配置的脚本。由于配置是手动编辑的,因此可以将未使用的拼写和变量添加到配置中。如何检测Bash环境变量是否被读取?

有没有办法获得有关变量的元数据,这将允许执行后步骤警告变量是否被读取?

可接受的答案包括

  • 一个方法来计算多少次变种已经阅读
  • 一个标志,如果该变种已经阅读
  • 一种方法来确定最后一次,是真的访问变量

可能还有其他可接受的答案未在上面列出。

这个问题的产生部分是因为默认情况下Bash是无类型的。

+1

如此以来,“没有,没有什么能像这”不是“可以接受的,我会离开,在一个评论。处理这个问题的常用方法是相反的。你的脚本/程序应验证其所有参数(无论他们来自)开始之前 – Mat 2013-05-10 11:56:12

+0

@Mat - 。由于被添加预执行验证,但我正在寻找一种更彻底的方式来实现这一目标 – 2013-05-10 12:21:55

回答

2

您的帖子中有两个问题。第一个问题:

如何检测Bash环境变量是否被读取?

即使没有可接受的答案包括我的,我先回答第一个问题,为他人的利益:

Nohow,除了修改猛砸。

你当然可以拒绝它。

第二个问题:

有没有一种方式来获得元数据有关的变量,将允许执行后的步骤警告如果一个变量没有被读取?

问这个问题没有多大意义,因为可能的答案不包括在可接受的答案列表中。但我仍会回答:

不,除非Bash被修改。

现在,即使您对我的意见不感兴趣,因为它不在可接受的答案列表中,我仍然将其作为练习呈现给我,也许为其他人提供有用的信息。

首先,在这种情况下发出警告是无用的,特别是在执行后。无论在提供参数时犯了什么错误,它们在那个时候都已经生效,不管是数据损坏还是时间浪费。而且,如果他们认为脚本的工作结果是OK的,大多数人都不会注意到警告。他们可能会发现他们后来错了,但可能为时已晚。

如果你要验证的参数,这样做之前执行和中止如果他们错了。

确保在环境变量名称中不存在拼写错误的一种方法是为它们创建一个名称空间,方法是要求它们的名称前缀为固定字符串,然后验证具有该前缀的所有变量名称是已知的该程序。但是,这不能防止前缀字符串中的拼写错误。尽管如此,我还没有其他的程序能够做到这一点,这可能意味着几乎没有人会期望程序的这种行为。这违反了“最不可思议的规则”,而且我会说,这样做是不必要的。

我会建议并不验证环境变量名。如果您的程序具有需要验证的复杂配置,请勿将其放入环境中。将其放入一个配置文件中,该文件不会与其他程序共享。

一个简单的方法来做到这一点是让配置文件来源的shell脚本 它设置一组变量。这将允许简单的“解析”(如Bash 将执行此操作)和验证。为了验证它,源它在子Shell (所以主壳不受影响),变量输出名称被设置, 滤除其被采购之前设置变量,然后比较它们 已知配置变量名称的列表。

事情是这样的:

function list_vars() { 
    declare -p | awk -F'[ =]' '/^declare/ {print $3}' 
} 

function unset_vars() { 
    while read v; do 
     unset "$v" 2>/dev/null; 
    done < <(list_vars); 
} 

declare -a CONF_VAR_NAMES=(FOO BAR BAZ) 

extra_vars=` 
    (
     # Unset all variables that can be unset (and thus set) 
     unset_vars 
     # List variables set after sourcing configuration 
     (. conf_file.sh; list_vars) | 
      # Remove variables set before sourcing 
      grep -v -F -f <(list_vars) 
    ) | 
     # Remove known variables 
     grep -v -F -f <(IFS=$'\n'; echo "${CONF_VAR_NAMES[*]}") 
` 

if [ -n "$extra_vars" ]; then 
    echo "Unknown variables set by configuration script: $extra_vars" >&2 
    exit 1 
fi 

您可能需要为路径和其他重要变量进行特殊处理,虽然。 这可能是简单地设置所有变量验证时只读采购, 之前一个好主意。

+0

这是一个非常有用的答案,我肯定不会从排除。候选人可以接受的答案列表似乎我需要找到一种不同的方式来提供可以接受的范例,以便不打消潜在的宝贵贡献。 – 2013-05-10 13:31:02