The "command not found" message is not very helpful. If e.g. the unzip command is not found but it's available in a package, it would be very interesting if the system could tell that the command is currently not available, but installing a package would provide it.


Because Ubuntu ships only with a single CD some commands that power-users expect are not installed (e.g. gcc, make).

Use cases

  • John sees a tutorial of how to unzip a package using the unzip command, and tries to follow it. The needed package is not installed, so he gets a message saying that installing the mentioned package is needed.


Bash has a "command_not_found" handler that is called in the interactive mode when a command is not found. The first argument is the command that is not found. We hook a custom python script into it that has a database (gdbm or similar) with the available commands as keys and some information (like a list of packages it is in) as value. This lookup needs to be fast. This information is assembled from various sources:

  • from the Content-$arch file
  • from a "by-hand" file to include additional stuff (like acroread)
  • a mirror with deb that are scanned for update-alternatives commands in

    • postinst


Code is available in and

A initial implementation is available in edgy. A version that also displays the component that is required for the package and that fixes some filtering problem is available as 0.2.0 in edgy.


The real evil for this spec is the "update-alternatives" command. A common application like "vi" is not shipped by the various packages as "vi" but as "vim","nvi", etc and updated via update-alternatives to "vi" in the postinst scripts. This needs to be evaluated as well. The problem is that some packages embed the call in bash code with "update-alternative $pkg" (e.g. the emacs postinst), making it hard to automatically parse the code.


It could suggest another spelling to the command, using a simple Spell Corrector:


CommandNotFoundMagic (last edited 2008-08-06 16:20:46 by localhost)