Сбросить переменную функции 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.