2011-06-14 16 views
1

我使用來搜索所有這些,然後循環,沒有運氣來取消他們試圖取消設置功能設置的bash函數不能用「非固定-f」時,函數名在一個循環的變量

在循環時解封非

循環的工作方式(例如其中創建bar_取消)

function bar_ { echo "bar"; } 
function_name="bar_" 
echo -n "before unset found function: --> " 
declare -F $function_name || echo "<not found>" 
unset -f $function_name 
echo -n "after unset found function: --> " 
declare -F $function_name || echo "<not found>" 
echo "" 

然而,它未能去掉自己

function foo_ { echo "bar"; } 
declare -F | cut -d" " -f3 | grep foo_ | while read function_name 
do 
    echo -n "before under found function: --> " 
    declare -F $function_name || echo "<not found>" 
    unset -f ${function_name} 
done 
echo -n "after unset found function: --> " 
declare -F foo_ || echo "<not found>" 
echo "" 

這是一些範圍問題?我試圖在eval中包裝未設置的聲明,但沒有任何效果。

+1

每行結尾處的分號和反斜槓是怎麼回事? – 2011-06-14 00:44:54

+0

我很好奇:您首先需要做什麼? :) – sarnold 2011-06-14 00:46:07

+0

分號和支柱只是這樣,它會很容易地運行我在一個容易複製粘貼行的測試。 – flosst 2011-06-14 01:10:18

回答

2

這裏的問題不是循環,而是管道。試試這個方法:

function foo_ { 
echo "bar" 
} 

while read function_name 
do 
    echo -n "before under found function: --> " 
    declare -F $function_name || echo "<not found>" 
    unset -f ${function_name} 
done < <(declare -F | cut -d" " -f3 | grep foo_) 

echo -n "after unset found function: --> " 
declare -F foo_ || echo "<not found>" 
echo "" 

這使用bash進程替換。 或者,您可以在這裏使用臨時文件或協處理。

+0

謝謝。解決完全正確。完全消隱在管子上 – flosst 2011-06-14 01:12:13

1

當你有一個管道時,管道是在一個子shell中,並且不能以變量的方式影響外殼。有時很煩人。

您的解決方案:輸出命令(echo「unset -f $ function_name」),然後評估循環的輸出。

+0

模式確定感謝您的幫助 – flosst 2011-06-14 01:12:20

1

使用Bash內建compgen可以避免子外殼問題。

IFS=$' \t\n' 
unset -f $(compgen -A function foo_) 

在一個相關的注意,您可以通過使用env -i關閉功能查找單個命令。

ls() { echo 'Hello, world!'; } 

ls 

env -i ls 
相關問題