Wie kann ich eine Bash-Funktion deaktivieren oder entfernen?

33

Wenn Sie eine Umgebungsvariable in Bash setzen oder exportieren, können Sie sie deaktivieren . Wenn Sie in bash einen Alias festlegen , können Sie den Alias aufheben . Aber es scheint keine Fehlfunktion zu geben .

Betrachten Sie diese (triviale) Bash-Funktion, die beispielsweise in einer .bash_aliases- Datei festgelegt und bei der Shell-Initialisierung gelesen wird.

function foo () { echo "bar" ; }

Wie kann ich diese Funktionsdefinition aus meiner aktuellen Shell löschen?
(Ändern der Initialisierungsdateien oder Neustarten der Shell zählen nicht.)

Quacksalber
quelle
Alles, was gesagt wird, unfunctionwäre ein schöner Name für einen Befehl :-)
Joey
@Johannes Rössel: zsh hat es.
Chris Johnsen
Hm, in der Tat. Trotzdem finde ich PowerShells Art, mit all dem etwas intuitiver und konsistenter umzugehen :-)
Joey,

Antworten:

50

Der nicht festgelegte eingebaute Befehl enthält eine Option -fzum Löschen von Funktionen:

unset -f foo

Bilden Sie den nicht gesetzten Eintrag in der bash- Manpage:

Wenn -f angegeben wird, bezieht sich jeder Name auf eine Shell-Funktion, und die Funktionsdefinition wird entfernt.

Hinweis: -fist nur dann wirklich notwendig, wenn eine Variable mit dem gleichen Namen existiert. Wenn Sie nicht auch eine Variable mit dem Namen haben foo, unset foowird die Funktion gelöscht.

Chris Johnsen
quelle
das hat mir gefehlt Ich hatte den -fParameter im Export gefunden, aber nicht in unset gefunden . Vielen Dank.
Quack quixote
2
@XavierStuvw: unsetist kein externer Befehl, sondern Teil der Shell ( in diesem Fall bash ); versuchen Sie man bash, den Eintrag für zu finden unset(das verwalten ist ziemlich groß, unsetbefindet sich unter dem Shell Builtin CommandsAbschnitt).
Chris Johnsen
4

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

Es gibt weder unset --helpnoch man unsetleider.

XavierStuvw
quelle
4
Es ist nicht , man unsetweil es sich um eine integrierte in Befehl und für die Einbau- Befehle gibt es statt help. Für einige eingebaute Befehle gibt es auch eine externe ausführbare Datei. Im Zweifelsfall versuchen Sie zB type mycommnad. Zum Beispiel type unsetund es wird Ihnen antworten unset is a shell builtin. Wenn Sie wissen möchten, ob es die ausführbare Datei gibt, versuchen Sie es mit which echoeinem anderen Buikt-In. Das --option_longist typisch für den ausführbaren Befehl. Versuchen Sie echo --helpund /bin/echo --help. :-).
Hastur
@Hastur Sie können der Antwort auch einen Kommentar hinzufügen, indem Sie den Schwanz bearbeiten. Wenn der Prüfer zustimmt, erhalten Sie 2 Punkte.
XavierStuvw
1
... danke für den Gedanken Xavier: es war mehr für dich als die Antwort zu vervollständigen; Ich vermute, Sie haben versäumt, dass es sich um einen eingebauten Befehl handelt, den Sie helpstattdessen verwenden müssen man. (Nicht wirklich wahr, weil Sie sie im man bashKapitel SHELL BUILTIN COMMANDS oder direkt mit man BASH-BUILTINS... finden). Es ist gemütlich, dass Sie unter einer Bash-Shell einfach danach fragen können helpund die Liste der eingebauten Befehle erhalten :-). (Versuchen help helpund man manauch).
Hastur
1
@Hastur Vielleicht vervollständigen Sie die Antwort zum Wohle aller Leser. Dann können wir die Kommentare löschen, um Kleingedrucktes loszuwerden.
XavierStuvw