The bash manual and info pages state: | If the search is unsuccessful, the shell searches for a | defined shell function named 'command_not_found_handle'. If that | function exists, it is invoked with the original command and the | original command's arguments as its arguments, and the function's | exit status becomes the exit status of the shell.
This fails to mention that command_not_found_handle() is run in the subshell forked to 'exec' the command, so even an explicit 'exit' will not exit anything but that subshell. It also means a command handler can't do anything that influences the main shell, except send it a signal with 'kill'. The phrasing "the function's exit status becomes the exit status of the shell" is misleading to anyone without this knowledge, as it implies that the shell will exit with that status, whereas in fact all that happens is that $? is set to the function's exit status. - Martijn