2013-11-27 41 views
2

比方說,我有存在的變量在Bash的環境:如何確定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

我會盡量建議只是一個想法。代碼沒有經過測試,根本沒有進行優化,只是作爲一個例子。 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 
} 
相關問題