我想挂接到未找到命令的处理程序
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/命令未找到