Як вимкнути або позбутися функції башма?


33

Якщо ви встановите або експортуєте змінну середовища в bash, ви можете її зняти . Якщо ви встановите псевдонім у bash, ви можете скасувати його. Але , здається, не бути unfunction .

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

function foo () { echo "bar" ; }

Як я можу очистити це визначення функції від моєї поточної оболонки?
(Зміна файлів ініціалізації або перезавантаження оболонки не враховується.)


Все, що було сказано, unfunctionбуло б приємною назвою для команди :-)
Joey

@Johannes Rössel: zsh має.
Кріс Джонсен

Гм, справді. І все-таки я вважаю спосіб PowerShell поводитися з усім цим трохи інтуїтивніше і послідовніше :-)
Joey

Відповіді:


50

Знято з охороною вбудованої команди приймає параметр, -fзображення без:

unset -f foo

Сформувати відключене запис в Баш сторінки керівництва:

Якщо -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на жаль.


4
Існує не man unsetтому, що це вбудована команда, а для вбудованих команд є замість цього help. Для деяких вбудованих команд існує і зовнішній виконуваний файл. У разі сумнівів спробуйте, наприклад type mycommnad. Наприклад, type unsetі він відповість вам unset is a shell builtin. Якщо ви хочете дізнатися, чи існує він також виконуваного файлу, спробуйте which echo(інший вхід), і він скаже, де він знаходиться. --option_longТиповий виконуваної команди. Спробуйте echo --helpі /bin/echo --help. :-).
Hastur

@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

Деякі варіанти цього можуть бути корисними для когось там, який з будь-якої причини хоче зробити щось подібне і не може перезапустити нову оболонку або не хоче.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.