在 Ubuntu 中挂接“未找到命令”处理程序

在 Ubuntu 中挂接“未找到命令”处理程序

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

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,如果存在,我想激活该虚拟环境。

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

答案1

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

要查看该函数定义的行为,您可以发出:

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

答案2

一般来说

Linux 杂志有一篇非常好的文章:

来自 bash 的手册页:

... 仅当在哈希表中未找到命令时,才会对 PATH 中的目录进行完整搜索。如果搜索不成功,shell 将搜索名为 command_not_found_handle 的已定义 shell 函数。如果该函数存在,则使用原始命令和原始命令的参数作为其参数来调用它,并且该函数的退出状态将成为 shell 的退出状态。如果未定义该函数,shell 将打印错误消息并返回退出状态 127。

在 /etc 中快速执行 grep 可以发现发生这种情况的位置。该函数本身位于 /etc/bash_command_not_found 中,并且该函数(如果存在)会通过 /etc/bash.bashrc 包含在您的 bash 会话中。

Ubuntu 14.04

经验证据表明,在 Ubuntu 14.04 安装中,文件 /etc/bash_command_not_found 不存在,但正确的文件是一个 python 脚本,位于/usr/lib/命令未找到

相关内容