Jak rozbroić lub pozbyć się funkcji bash?

33

Jeśli ustawisz lub wyeksportujesz zmienną środowiskową w bash, możesz ją rozbroić . Jeśli ustawisz alias w bash, możesz go odblokować . Ale wydaje się, że nie ma zakłóceń .

Rozważmy tę (trywialną) funkcję bash, na przykład ustawioną w pliku .bash_aliases i czytającą przy inicjalizacji powłoki.

function foo () { echo "bar" ; }

Jak mogę usunąć tę definicję funkcji z mojej bieżącej powłoki?
(Zmiana plików inicjujących lub ponowne uruchomienie powłoki nie ma znaczenia.)

quack quixote
źródło
To powiedziawszy, unfunctionbyłoby ładną nazwą polecenia :-)
Joey,
@Johannes Rössel: zsh ma to.
Chris Johnsen
Hm, rzeczywiście. Mimo to uważam, że PowerShell radzi sobie z tym wszystkim nieco bardziej intuicyjnie i konsekwentnie :-)
Joey

Odpowiedzi:

50

Rozbrojony wbudowane polecenie wykonuje opcję -f, do funkcji Delete:

unset -f foo

Utwórz nieustawiony wpis na stronie podręcznika bash :

Jeśli podano -f, każda nazwa odnosi się do funkcji powłoki, a definicja funkcji jest usuwana.

Uwaga: -fjest to naprawdę konieczne tylko wtedy, gdy istnieje zmienna o tej samej nazwie. Jeśli nie masz również zmiennej o nazwie foo, unset foousunie funkcję.

Chris Johnsen
źródło
tego mi brakowało. znalazłem -fparametr w eksporcie, ale nie znalazłem go w stanie nieustawionym . dzięki.
quack quixote
2
@XavierStuvw: unsetnie jest poleceniem zewnętrznym, jest częścią powłoki ( w tym przypadku bash ); spróbuj man bashznaleźć wpis dla unset(zarządzanie jest dość duże, unsetznajduje się w Shell Builtin Commandssekcji).
Chris Johnsen,
4

Zobacz 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.

Nie ma unset --helpani man unsetniestety.

XavierStuvw
źródło
4
Nie dzieje się tak, man unsetponieważ jest to wbudowane polecenie, a zamiast tego wbudowane polecenia help. Dla niektórych wbudowanych poleceń istnieje również zewnętrzny plik wykonywalny. W razie wątpliwości spróbuj np type mycommnad. Na przykład type unseti odpowie ci unset is a shell builtin. Jeśli chcesz wiedzieć, czy istnieje plik wykonywalny, spróbuj which echo(inny buikt-in) i powie, gdzie on jest. Jest --option_longto typowe dla polecenia wykonywalnego. Spróbuj echo --helpi /bin/echo --help. :-).
Hastur
@Hastur Zachęcamy do dodania komentarza do odpowiedzi poprzez edycję jej ogona. Jeśli recenzenci to zaakceptują, otrzymasz 2 punkty.
XavierStuvw
1
... dzięki za myśl Xavier: było dla ciebie więcej niż uzupełnienie odpowiedzi; Myślę, że przegapiłeś, że było to wbudowane polecenie i dla nich musisz użyć helpzamiast man. (Niezupełnie prawda, ponieważ można je znaleźć w man bashrozdziale KOMENDY WBUDOWANE SHELLTIN lub bezpośrednio w man BASH-BUILTINS...). Jest to wygodne, że pod powłoką bash możesz po prostu poprosić, helpa otrzymasz listę wbudowanych poleceń :-). (Spróbuj help helpi man manzbyt).
Hastur
1
@Hastur Możesz wypełnić odpowiedź z korzyścią dla wszystkich czytelników. Następnie możemy usunąć komentarze, aby pozbyć się drobnego bałaganu.
XavierStuvw,
0

Niedawno chciałem całkowicie go odinstalować nvmi ponownie zainstalować, a także pozbyć się dowolnego środowiska. Okazuje się, że pozbycie się go nie wydaje się, ponieważ duża część nvmjest częściowo zaimplementowana jako mnóstwo funkcji powłoki, które są pozyskiwane do twojej powłoki za pośrednictwem .bash_profilelub .bashrc, lub gdziekolwiek dodałeś polecenia pozyskiwania, o których mówiłeś, kiedy ją instalowałeś.

Zaskoczony na początku which nvmnie zwracając jeszcze wyraźnego nvmpolecenia i innych wciąż znajdowano, w końcu odkryłem, declare -Fże to mnóstwo funkcji powłoki. Nie chciałem po prostu zabijać powłoki i uruchamiać nowej (z powodów nieistotnych tutaj), więc wyczyściłem nvmfunkcje z tej powłoki za pomocą tego:

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

Niektóre warianty tego mogą być pomocne dla kogoś, kto z jakiegoś powodu chce zrobić coś podobnego i nie może zrestartować nowej powłoki lub nie chce.

slowkoni
źródło