Невозможно использовать функцию bash, используя "unset -f", если имя функции указано как переменная в цикле - PullRequest
1 голос
/ 14 июня 2011

Я пытаюсь сбросить функцию, используя поиск всех из них, а затем зацикливаясь, чтобы сбросить их без удачи

Работает не петлевый способ (пример, где 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 безрезультатно.

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

Проблема здесь не в петле, а в трубе.Попробуйте это так:

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.В качестве альтернативы вы можете использовать временный файл или сопроцесс здесь.

1 голос
/ 14 июня 2011

Используя встроенную функцию Bash compgen, вы можете избежать проблемы подоболочки.

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

В связанной заметке вы можете отключить поиск функций для одной команды, используя env -i.

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

ls

env -i ls
1 голос
/ 14 июня 2011

Когда у вас есть конвейер, конвейер находится в подоболочке и не может влиять на внешнюю оболочку, в зависимости от переменной.Время от времени очень раздражает.

Ваше решение: вывести команды (echo "unset -f $ имя_функции") и затем проверить вывод цикла.

...