命令建议是如何在bashshell中实现的?

命令建议是如何在bashshell中实现的?,bash,shell,search-suggestion,autocorrect,Bash,Shell,Search Suggestion,Autocorrect,我目前为普通英语单词实现了一个简单的“你的意思是……”,其工作原理如下: 如果用户输入“Kack”,请在QWERTY键盘上检查单词中每个字母周围的字母表,并逐个替换它们。(例如,这里的J、L、M、I、O代表“K”;Q、W、S、Z、X代表“a”等等) 根据文本语料库的训练,返回最有可能的单词(如果是这样的话,用户也输入了单词本身) 如何在linux命令行中实现代码建议?bash没有实现建议逻辑;它位于一个定义为bash初始化文件一部分的函数中,它是由您的发行版(Ubuntu/Debian,大概

我目前为普通英语单词实现了一个简单的“你的意思是……”,其工作原理如下:

  • 如果用户输入“Kack”,请在QWERTY键盘上检查单词中每个字母周围的字母表,并逐个替换它们。(例如,这里的J、L、M、I、O代表“K”;Q、W、S、Z、X代表“a”等等)
  • 根据文本语料库的训练,返回最有可能的单词(如果是这样的话,用户也输入了单词本身)

如何在linux命令行中实现代码建议?

bash
没有实现建议逻辑;它位于一个定义为bash初始化文件一部分的函数中,它是由您的发行版(Ubuntu/Debian,大概是这样)放在那里的

bash
提供了实现此类功能的机制:当它尝试执行命令,但未找到该命令时,如果定义了函数
command\u not\u found\u handle
,它将调用该函数

在我的机器(Ubuntu变体)上,该函数定义如下:

gk@Jarvis:~$ sudi
No command 'sudi' found, did you mean:
Command 'sudo' from package 'sudo-ldap' (universe)
Command 'sudo' from package 'sudo' (main)
sudi: command not found

(和
/usr/lib/command not found
存在,可执行,是Python脚本。)

来自Bash手册页:

命令执行

[……]

如果名称既不是shell函数也不是内置函数,并且不包含斜杠,bash将在
路径的每个元素中搜索包含该名称的可执行文件的目录。Bash使用哈希表来记住可执行文件的完整路径名(请参见下面SHELL内置命令下的
hash
)。只有在哈希表中找不到该命令时,才会对路径中的目录执行完整搜索。如果搜索不成功,shell将搜索名为
命令\u未找到\u句柄的已定义shell函数
。如果该函数存在,将使用原始命令和原始命令的参数作为其参数调用它,并且函数的退出状态将成为shell的退出状态。如果未定义该函数,shell将打印一条错误消息并返回127的退出状态

让我们试试这个:

$ type command_not_found_handle
command_not_found_handle is a function
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -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" 1>&2;
            return 127;
        fi;
    fi
}
这样,如果以后再次安装或删除
命令notfound
包,则不必更改配置文件

我不知道Ubuntu的程序是如何实现的,但通常情况下,这样的工具会列出所有已知的命令,并找到最相似的命令。然后,它可能会检查该程序是否已安装,如果未安装,则检查提供该程序的软件包,并建议安装该程序


搜索“相似文本”通常通过计算两个字符串之间的距离来完成。考虑到当前的键盘布局,输入错误字母的可能性有多大,这将是一个非常明智的补充。

谢谢!你怎么知道的?我的意思是,在更一般的情况下,比如说没有CLI,我如何发现从CLI调用了什么函数?@Ketcomp:Read
manbash
。(在
命令执行
部分的第三段)在rici的回答之后,我试图使用grep在手册页中查找相关数据。但后来你发了这个;)+1为在线重新定义函数,更好地说明逻辑@Ketcomp:在
man bash
(或
man
anything)中,您可以通过键入
/
,后跟要搜索的字符串进行搜索,假设您使用
less
作为寻呼机
h
将为您提供可能的
less
命令的摘要。你会发现这比grep更容易。 $ foobar bash: foobar: command not found $ function command_not_found_handle { echo "I'm so sorry, what is '$1'?"; } $ foobar I'm so sorry, what is 'foobar'?