Debian/Ubuntu supply Bash with an extension that lets you define a
function to be run whenever a command in an interactive shell hasn't
been found.  As shipped it does things like this, which can be handy:

  $ echo znetnerg gungpure | rot13
  The program 'rot13' is currently not installed. You can install it by
  typing: sudo apt-get install bsdgames
  bash: rot13: command not found

This feature's documentation in its entirety, is an item in the 'Shell
Variables' list in bash(1):

  command_not_found_handle
    The name of a shell function to be called if a command cannot be
    found.  The  return  value  of this function should be 0, if the
    command is available after execution of the function,  otherwise 127
    (EX_NOTFOUND).  Enabled only in interactive, non POSIX mode shells.
    This is a Debian extension.

Points of hate:

* The docs suggest that you set $command_not_found_handle to the name of
  the function you want to run.  I couldn't get this to work.

  The shipped function is called command_not_found_handle (and
  $command_not_found_handle doesn't appear to be set anywhere); so far
  as I can tell you simply define your function with that name for it to
  work, and the documented variable simply doesn't exist.

* Because the API only provides for a single function, not an array of
  them, it's needlessly hard to set up a series of fallbacks -- for
  example to try the shipped 'uninstalled package' thing first and then
  something else.

  To get this your function has to duplicate the default behaviour
  before adding in its own check.  This obviously doesn't scale, and
  makes assumptions about what the default behaviour is.

* The default function in its entirety is this:

    command_not_found_handle () 
    { 
        /usr/bin/python /usr/lib/command-not-found -- $1;
        return $?
    }

  It only has two lines, and the second is entirely redundant!  And the
  underlying Python program that determines whether the command is a
  program in an uninstalled package has the generic name
  command-not-found rather than something which indicates what this
  particular not-found handler does.

* Whether that program knows about the command (and successfully tells
  you which package to install) or it can't help at all, the spec says
  it has to return 127 (because in neither case has the command been
  installed, for next time).  This makes using it in a chain of
  fallbacks more work than necessary, because you have to capture its
  output to see if it's worked.

  (Then save its exit code, check if there was any output, and if so
  echo the output and exit with the exit code.)

  How hard would it'd've been to come up with different exit codes to
  distinguish these situations?  Perhaps this 'uninstalled package'
  scenario isn't one the authors of the feature considered -- except
  that this is a Debian extension that appears to have been written
  especially to provide this behaviour!

Grrr!

Smylers

Reply via email to