I know that I can use unset -f $FUNCTION_NAME
to unset a single function in bash / zsh, but how do I unset all functions?
2 Answers
In the zsh
shell, you may disable all functions using
disable -f -m '*'
(literally, "disable each function whose name matches *
").
You may then enable them again with the analogous enable
call.
You may also use unset
in a similar way to remove the functions completely from the current environment:
unset -f -m '*'
-
Is there a way to disable all functions whose names don't start with
_
, or only disable functions defined in a file? Thanks!– Teddy CCommented Mar 10, 2020 at 11:31 -
1@TeddyC My answer uses
*
as a globbing pattern that matches all function names. You could usedisable -f -m '[!_]*'
to disable all functions that does not start with an underscore. This could not be used for disabling the functions defined in a file unless their names follow a specific pattern. If by "defined" you mean that their names are simply listed, one per line, in a file, you could usedisable -f $(<thefile)
– Kusalananda ♦Commented Mar 10, 2020 at 11:38 -
By "defined" I mean that what the functions do are defined in the file - what about this case then? Thanks!– Teddy CCommented Mar 10, 2020 at 11:49
-
@TeddyC This is quite a different problem then. You may want to ask about this in a separate question.– Kusalananda ♦Commented Mar 10, 2020 at 15:16
The associative array functions
contains all the defined functions (including autoloading stubs), so ${(k)functions}
expands to the list of names of defined functions.
unset -f ${(k)functions}