挂接到Ubuntu中的“找不到命令”处理程序


9

我想挂接到未找到命令的处理程序中

wim@SDFA100461C:~$ thing
No command 'thing' found, did you mean:
 Command 'tping' from package 'lam-runtime' (universe)
 Command 'thin' from package 'thin' (universe)
thing: command not found

我想用自己的脚本覆盖此行为。

具体来说,我想检查命令是否存在于的输出中lsvirtualenv -b,如果存在,我想激活该virtualenv。

我应该从哪里开始黑客攻击?


1
这可能会有所帮助:askubuntu.com/a/73282/10127
glenn jackman 2014年

Answers:


8

一般来说

Linux杂志有一个相当不错的文章:

从bash的手册页中:

...仅当在哈希表中找不到命令时,才对PATH中的目录进行完全搜索。如果搜索失败,则外壳程序将搜索已定义的名为command_not_found_handle的外壳程序函数。如果该函数存在,则以原始命令和原始命令的参数作为其参数来调用它,并且该函数的退出状态成为外壳程序的退出状态。如果未定义该函数,则外壳程序将显示一条错误消息并返回退出状态127。

/ etc中的快速grep发现了发生的地方。该函数本身位于/ etc / bash_command_not_found中,并且该函数通过/etc/bash.bashrc包含在bash会话中(如果存在)。

Ubuntu 14.04

经验证据表明,在Ubuntu 14.04安装中,文件/ etc / bash_command_not_found不存在,但是,正确的文件是位于/ usr / lib / command-not-found的python脚本。


1
这使我走上了正确的道路,但实际程序是位于的python脚本/usr/lib/command-not-found。在我的Ubuntu 14.04安装中,该文件/etc/bash_command_not_found不存在。
2014年

谢谢,我添加了到我的回答对未来的观众
安德鲁拔

1

对于bash,其行为由shell函数控制command_not_found_handle(请参阅man bashCOMMAND EXECUTION下的)。

要查看该函数定义了什么行为,可以发出:

declare -p -f command_not_found_handle

您可以通过重新定义command_not_found_handle功能来更改使用哪个程序。

在Ubuntu 14.04 LTS中,默认行为似乎直接在中定义/etc/bash.bashrc

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
    function command_not_found_handle {
            # check because c-n-f could've been removed in the meantime
            if [ -x /usr/lib/command-not-found ]; then
               /usr/lib/command-not-found -- "$1"
               return $?
            elif [ -x /usr/share/command-not-found/command-not-found ]; then
               /usr/share/command-not-found/command-not-found -- "$1"
               return $?
            else
               printf "%s: command not found\n" "$1" >&2
               return 127
            fi
    }
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.