2013-11-27 11 views
0

我想運行一個Bash函數,它定義了幾個變量,然後在函數運行後列表它已經「嘗試」定義的所有變量。這樣的清單將包括那些已經存在但是功能沒有改變的變量的名稱。你能指出我在這方面的正確方向嗎?如何列出由Bash函數定義的變量,包括那些由函數不變的預先存在的變量

編輯:我已經在下面添加了一些代碼來進一步解釋我想完成什麼,並提供靈感。

#!/bin/bash 

variable1="zappo" 

#listOfVariables1="$(printenv)" 
listOfVariables1="$(set)" 

function1(){ 
    variable1="zappo" 
} 

function1 

#listOfVariables2="$(printenv)" 
listOfVariables2="$(set)" 

echo -e "\ncomparing initial list of variables with final list of variables...\n" 
diff <(echo "${listOfVariables1}") <(echo "${listOfVariables2}") 

回答

0

set命令將顯示所有shell環境變量,包括那些用戶定義的。

要在函數前後輕鬆使用變量列表(可能很長),可以使用例如diff

set > set_before.tmp 
my_func 
set > set_after.tmp  
diff set_before.tmp set_after.tmp 
+0

感謝您的協助。正如你所建議的那樣,我在上面添加了一些代碼來嘗試使用''set'''。我不知道如何繼續以獲取腳本末尾包含'''variable1''的列表。 – d3pd

+0

爲什麼在腳本的* end *處需要'variable1'?這在原文中沒有提及。 – suspectus

0

嘗試編輯你的bash函數它在執行結束時打印環境。然後,您可以比較(diff list1 list2)您得到的列表和printenv結果,而無需使用腳本。

#!/bin/bash 
printenv > /tmp/list1 

{ 
    cat $(which your_function) 
    echo 'printenv > /tmp/list2' 
} >/tmp/fake.sh 

chmod +x /tmp/fake.sh 
/tmp/fake.sh 

diff /tmp/list1 /tmp/list2 

另外,如果你只需要設置這個變量,你需要運行. $(which your_function)

變量將不會在父範圍,如果你簡單的運行your_function改變。

+0

感謝您的協助。正如你所建議的,我已經添加了一些代碼來嘗試使用'''printenv'''。我不知道如何繼續以獲取腳本末尾包含'''variable1''的列表。 – d3pd

+0

只是嘗試在我的答案中使用代碼。用你想要的功能替換'your_function'並運行。 –