Public bug reported: In a nutshell, if the package command-not-found is removed, but not purged, sourcing this file leads to silent failures if a command is not found.
I don't use Ubuntu, but I assume that the file bash_command_not_found in the bzr repository is installed to /etc ./x is your bash_command_not_found with /usr/ replaced by /ur/ to simulate that the packages is removed but not purged. I use a self written printexitvalue (see tcsh and zsh), which prints the line "bash: exit $?" via $PROMPT_COMMAND - this is unrelated to the bug, but shown in the output below. $ unset -f command_not_found_handle $ cat x command_not_found_handle() { if [ -x /ur/lib/command-not-found ]; then /ur/lib/command-not-found -- "$1" return $? else return 127 fi } $ foo bash: foo: command not found bash: exit 127 $ . ./x $ foo bash: exit 127 $ As you can see, trying to run the non-available command foo results in no output (except of the one I do in $PROMPT_COMMAND) and correctly fails with exit code 127. It does not print "bash: foo: command not found", as it should. command_not_found_handle() is not command_not_found_handler() (note the trailing 'r' in the word handler, that's not in the word handle). man bash (for the former function) and man zshall (for the latter function) contain the glory details how both functions work and how they differ. If /usr/lib/command-not-found is available, your command_not_found_handle() implementation behaves as it should, but if /usr/lib/command-not-found is not available it behaves as zsh's command_not_found_handler() should, but not as a command_not_found_handle() should. An untested, but presumably correct implementation, except of the unconditional overwriting of the function (I don't know how to prevent this in bash properly), and returning 127 when it should return 126 (see man p exec), based on /etc/zsh_command_not_found, is shown below. Please replace two leading spaces with a tab, four leading spaces with two tabs and so on; and don't replace "|| return $?" with "\nreturn $?", in case someone uses set -e interactively. I quoted the words return and builtin to guard against weird alias definitions (I did not do this in the zsh snipppet because, in general, I expect zsh users to have at least basic shell knowledge, and sometimes zsh users do ugly things on purpose. # (c) Zygmunt Krynicki 2007, # Licensed under GPL, see COPYING for the whole text # # This script will look-up command in the database and suggest # installation of packages available from the repository if [[ -x /usr/lib/command-not-found ]] ; then command_not_found_handle() { [[ -x /usr/lib/command-not-found ]] || { \builtin printf >&2 'bash: %scommand not found\n' ${1+"$1: "} \return 127 } /usr/lib/command-not-found -- ${1+"$1"} || \return $? } fi ** Affects: command-not-found (Ubuntu) Importance: Undecided Status: New -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1479805 Title: /etc/bash_command_not_found is utterly broken To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/command-not-found/+bug/1479805/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs