如何确定是否再次定义了Bash变量或函数*?

时间:2013-11-27 19:20:15

标签: bash function environment-variables environment

假设我在Bash环境中存在一个变量:

variable1="zappo"

现在,假设我再次定义该变量,具有完全相同的值:

variable1="zappo"

我可以通过什么方式在shell脚本中确定第二个定义是否已经发生?我对Bash变量定义 如何更改环境中的变量感到担忧,而不是 如何更改环境中的变量。

如果你想考虑一个实现,想象一个脚本,一个源来建立一个变量环境。想象一下,该脚本以前是源代码,并且它定义的一些变量已被更改。我需要脚本的第二个源代码来列出它已定义的变量,尽管其中一些变量可能存在相同的值。

对这个概念的概括,你能想出一种列出重新获得的功能的方法吗?假设有一个由函数库组成的脚本。最初获取此脚本,然后更改库脚本中的一个函数,从而需要重新获取库脚本。这样的库脚本如何列出它重新定义的函数,即使许多重新定义的函数与之前定义的函数没有什么不同?

以下是一些可以为功能列表提供一些灵感的代码:

#!/bin/bash

initialListOfFunctionsInEnvironment="$(typeset -F | awk -F"declare -f " '{print $2}')"

function1(){
    variable1="zappo"
}

function2(){
    variable1="zappo"
}

finalListOfFunctionsInEnvironment="$(typeset -F | awk -F"declare -f " '{print $2}')"
functionList="$(diff  <(echo "${initialListOfFunctionsInEnvironment}" ) <(echo "${finalListOfFunctionsInEnvironment}") | grep -E '^(<|>)' | awk -F"> " '{print $2}')"

echo -e "\nlist of functions loaded:"
echo "${functionList}"

1 个答案:

答案 0 :(得分:0)

我会尝试提出一个想法。代码未经过测试,根本没有进行优化,仅作为示例。 egrep中使用的正则表达式将在函数声明中适应您的编码风格。

我们的想法是使用这样的辅助函数来获取库

function re-source {
    for i in `cat $1 | egrep -o 'function\s+\S+\s?(\(\))?' | sed 's/function//'`; do
        if [[ typeset -F $i ]]; then
            local old_$i=$(typeset -f $i);
        fi
    done

    source $1

    for i in `cat $1 | egrep -o 'function\s+(\S+)\s?(\(\))?' | sed 's/function//'`; do
        if [[ diff <(typeset -f $i) old_$i ]]; then
            echo "$i updated";
        fi
    done
}