Сбросить переменную функции bash с нестандартным именем

У меня может быть эта функция в скрипте bash, который поступает в оболочку

function suman{
     echo "using suman function"
}

если я позвоню

unset suman

кажется, все работает как положено

Однако, если у меня есть это как моя функция:

function suman-inspect {
     echo "using suman-inspect function"
}

тогда если я позвоню

unset suman-inspect

или же

unset "suman-inspect"

Я получаю это сообщение:

bash: unset: `suman-inspect': not a valid identifier

Как можно сбросить эту переменную как есть?

2 ответа

Решение

После еще одного исследования выясняется, что

unset -f "suman-inspect"

буду работать. Это удивительно, потому что unset suman работал, и успешно отключил функцию suman (насколько я мог судить).

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

Так:

set -o posix
function suman-inspect { echo "using suman-inspect function"; }

дает:

bash: `suman-inspect': not a valid identifier

ruakh делает правильное замечание, цитируя man bash, Исходный код (builtins/set.def) имеет комментарий: Posix.2 говорит, сначала попробуйте переменные, затем функции, но...

Стандарт POSIX гласит: если не указан ни -f, ни -v, имя ссылается на переменную; если переменная с таким именем не существует, не определено, должна ли быть отключена функция с таким именем, если таковая имеется.

Таким образом, на самом деле поведение этого старого режима ожидания не указано *. Если что, ошибка в документации bash. Но, если честно, в другом месте man bash это говорит:

Определение функции может быть удалено с помощью опции -f встроенной функции unset.

Другие вопросы по тегам