假设我在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}"
答案 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
}