Since bash 5.2, enable mkdir is equivalent to enable -f mkdir mkdir.
But, if you use the -n flag, and mkdir is not a loaded builtin, it will
also be equivalent to enable -f mkdir mkdir (so the -n flag is
ignored), and the newly loaded foo will be enabled instead of disabled:
$ ./bash -c 'cd ./examples/loadables; enable -n mkdir; enable -a' |
> grep mkdir
enable mkdir
If you call enable -n mkdir again, mkdir will be disabled:
$ ./bash -c 'cd ./examples/loadables; enable -n mkdir; enable -n mkdir
> enable -a' | grep mkdir
enable -n mkdir
I think that this is not intended and that, if the -n flag is specified,
enable should only try to disable all the loadable builtins named as the
argument, and skip, with a warning message, arguments that are not
loaded builtins; instead of trying to load (as enabled) arguments, that
are not loaded builtins, from files in the current directory and
BASH_LOADABLES_PATH as it does now.
Another "bug" caused by the new behaviour of enable name is that
enable '' will be equivalent to enable -f '' '' that causes bash to
call dlopen() with "" as filename that, at least on GNU/Linux, seems to
have the same behaviour as NULL as filename, so dlopen() will use
current process's executable as file, and enable '' will try to load
the _struct symbol from the bash binary as a builtin, instead of
erroring:
./bash: line 1: enable: cannot find _struct in shared object : ./bash:
undefined symbol: _struct
./bash: line 1: enable: : not a shell builtin
The same thing happens when using enable -n '' since -n just is
ignored when the argument ('') is not a loaded builtin.
Also note that enable -f '' '' prints two error lines in bash 5.2,
while, in bash 5.1, it only prints one.
$ bash -c "enable -f '' ''"
bash: line 1: enable: cannot find _struct in shared object : bash: undefined
symbol: _struct
o/
emanuele6