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

wim*_*wim 9 bash ubuntu virtualenv

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*bbs 8

一般来说

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/command-not-found

  • 这让我走上了正确的道路,但实际的程序是一个位于“/usr/lib/command-not-found”的 python 脚本。在我安装的 Ubuntu 14.04 上,文件 `/etc/bash_command_not_found` 不存在。 (2认同)

Ran*_*all 2

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

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

declare -p -f command_not_found_handle
Run Code Online (Sandbox Code Playgroud)

您可以通过重新定义函数来更改使用哪个程序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
Run Code Online (Sandbox Code Playgroud)