[Bug 1479805] Re: /etc/bash_command_not_found is utterly broken
CarstenHey
carsten at debian.org
Wed Nov 4 00:32:23 UTC 2015
* Mathew Hodson [2015-11-03 20:09 -0000]:
> ** Changed in: command-not-found (Ubuntu)
> Importance: Undecided => Medium
'Medium' might be too high (if anybody cares if it is low or medium):
I wrote in my initial mail:
| I don't use Ubuntu, but I assume that the file bash_command_not_found
| in the bzr repository is installed to /etc
Looks like this assumption was wrong:
<http://packages.ubuntu.com/search?searchon=contents&keywords=_command_not_found&mode=&suite=xenial&arch=any>:
| You have searched for paths that end with _command_not_found in suite xenial, all sections, and all architectures. Found 1 results.
|
| File Packages
| /etc/zsh_command_not_found command-not-found
|
Hence, the actual bug only affects upstream, but not the Ubuntu package,
but Ubuntu would benefit from the minor zsh improvements.
Shipping (a fixed) bash_command_not_found in the source package and
providing it in the upstream repository is still useful, for example,
a sysadmin might disable command-not-found in the system wide
bash.bashrc and source /etc/bash_command_not_found if it exists in the
skeleton .bashrc.
Carsten
--
You received this bug notification because you are a member of Ubuntu
Sponsors Team, which is subscribed to the bug report.
https://bugs.launchpad.net/bugs/1479805
Title:
/etc/bash_command_not_found is utterly broken
Status in command-not-found package in Ubuntu:
In Progress
Bug description:
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
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/command-not-found/+bug/1479805/+subscriptions
More information about the Ubuntu-sponsors
mailing list