Как мне сбросить или избавиться от функции bash?

33

Если вы установите или экспортируете переменную окружения в bash, вы можете отменить ее. Если вы установите псевдоним в bash, вы можете удалить его. Но, кажется, не работает .

Рассмотрим эту (тривиальную) функцию bash, например, установите в файле .bash_aliases и прочитайте при инициализации оболочки.

function foo () { echo "bar" ; }

Как я могу удалить это определение функции из моей текущей оболочки?
(Изменение файлов инициализации или перезапуск оболочки не учитываются.)

шарлатан
источник
Все, что говорится, unfunctionбыло бы хорошим названием для команды :-)
Joey
@Johannes Rössel: ЗШ имеет его.
Крис Джонсен
Хм, действительно. Тем не менее, я нахожу способ PowerShell справляться со всем этим немного более интуитивным и последовательным :-)
Joey

Ответы:

50

Снято с охраной встроенной команды принимает параметр, -fдля функции удаления:

unset -f foo

Сформируйте неустановленную запись в man-странице bash :

Если указан -f, каждое имя относится к функции оболочки, и определение функции удаляется.

Примечание: -fдействительно необходимо, только если существует переменная с тем же именем. Если у вас также нет переменной с именем foo, то unset fooудалит функцию.

Крис Джонсен
источник
вот чего мне не хватало Я нашел -fпараметр в экспорте, но не нашел его в неустановленном состоянии . Благодарю.
Квик-кихот
2
@XavierStuvw: unsetэто не внешняя команда, это часть оболочки ( в данном случае bash ); попробуйте man bashнайти запись для unset(управление довольно большое, unsetнаходится в Shell Builtin Commandsразделе).
Крис Йонсен
4

Смотрите help unset:

unset: unset [-f] [-v] [-n] [name ...]

Unset values and attributes of shell variables and functions.

For each NAME, remove the corresponding variable or function.

Options:
  -f    treat each NAME as a shell function
  -v    treat each NAME as a shell variable
  -n    treat each NAME as a name reference and unset the variable itself
    rather than the variable it references

Without options, unset first tries to unset a variable, and if that fails,
tries to unset a function.

Some variables cannot be unset; also see `readonly'.

Exit Status:
Returns success unless an invalid option is given or a NAME is read-only.

Там нет unset --helpни, man unsetк сожалению.

XavierStuvw
источник
4
Это не man unsetпотому, что это встроенная команда, а для встроенных команд help. Для некоторых встроенных команд также существует внешний исполняемый файл. В случае сомнений попробуйте например type mycommnad. Например type unsetи вам ответят unset is a shell builtin. Если вы хотите узнать, существует ли исполняемый файл, попробуйте which echo(еще один вход), и он скажет, где он находится. --option_longТипичен исполняемой команды. Попробуйте echo --helpи /bin/echo --help. :-),
Хастур
@Hastur Не стесняйтесь добавлять свой комментарий к ответу, редактируя его хвост. Если рецензенты одобрят это, вы получите 2 балла.
XavierStuvw
1
... спасибо за мысль Ксавье: это было больше для вас, чем завершить ответ; Я думаю, вы пропустили, что это была встроенная команда, и вы должны использовать ее helpвместо man. (Не совсем так, потому что вы найдете их в man bashглаве КОМАНДЫ ОБЪЕКТА ОБОЛОЧКИ или непосредственно с помощью man BASH-BUILTINS...). Удобно, что под оболочкой bash вы можете просто запросить, helpи вы получите список встроенных команд :-). (Попробуй help helpи man manтоже).
Хастур
1
@Hastur Вы можете завершить ответ на благо всех читателей. Затем мы можем удалить комментарии, чтобы избавиться от мелкого шрифта.
XavierStuvw
0

Недавно я хотел полностью удалить nvmи переустановить его, а также избавиться от любой из его сред. Оказывается, избавиться от него, похоже, не потому, что большая часть nvmего частично реализована в виде множества функций оболочки, которые поступают в вашу оболочку через .bash_profileили .bashrc, или куда бы вы ни добавляли те команды извлечения, о которых вам было сказано при первой установке.

Сначала озадаченный тем, что which nvmничего не возвратил, но nvmкоманда все еще находилась, я обнаружил, declare -Fчто это набор функций оболочки. Я не хотел просто убивать оболочку и запускать новую (по причинам, не относящимся к делу), поэтому я удалил nvmфункции из этой оболочки следующим образом:

for F in `declare -F | grep -e nvm | cut -f 3 -d\ `; do unset -f $F; done

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

slowkoni
источник