1

我正在尝试使用搜索所有这些来取消设置功能,然后循环以取消设置它们,但没有运气

非循环方式有效(创建和取消设置 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 ""

这是一些范围问题吗?我尝试将 unset 语句包装在 eval 中无效。

4

3 回答 3

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 进程替换。或者,您可以在此处使用临时文件或协同进程。

于 2011-06-14T00:55:10.490 回答
1

当您有管道时,管道位于子外壳中,并且不能以可变方式影响外壳。有时很烦人。

您的解决方案:输出命令(echo "unset -f $function_name"),然后评估循环的输出。

于 2011-06-14T00:50:24.263 回答
1

使用 Bash 内置compgen可以避免子外壳问题。

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

在相关说明中,您可以通过使用关闭单个命令的函数查找env -i

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

ls

env -i ls
于 2011-06-14T10:34:55.477 回答