当你输入错误命令时,假设你想执行:
$ cd ..
$ ls
但是你打字太快,最后在 l 和 s 之间按了回车键,所以你得到:
$ cd ..
$ l
sbash: l: command not found...
当然,当我们快速打字时,这种情况总是会发生。我很好奇的是,在屏幕上出现错误的命令文本后,2.5 秒(在我的系统上)的暂停的来源。在我看来,它立即识别出错误的命令,打印有关它的错误消息,但只是为了好玩而等待 2.5 秒,然后才将我返回到命令行。这是什么原因造成的?有办法解决这个问题吗?这是一个小烦恼,但我想摆脱它。:)
编辑:运行 Fedora 16 系统
答案1
这种行为是由某些发行版中经常安装的挂接到 bash 的工具引起的。此挂接使得如果您尝试运行命令,而该命令不存在,则 bash 会搜索配置的存储库中可用的文件,并告诉您需要安装哪个软件包才能获取该命令。
如果您使用的不是 Debian 系统,则需要查看 bash 启动文件配置文件等,看看是否有任何内容定义了名为 的函数command_not_found_handle
。如果定义了该 bash 函数,则每当您运行命令且在搜索路径中找不到相应的程序时,都会调用该函数。如果您运行typset | less
并浏览输出,command_not_found_handle()
则如果该函数已定义,您将看到它。
在 Debian/Ubuntu 上,提供此行为的软件包是找不到命令。如果您清除它,那么您将禁用查找,这确实会减慢速度。
以下是一个例子
# command-not-found installed
$ time pwgen
The program 'pwgen' is currently not installed. To run 'pwgen' please ask your administrator to install the package 'pwgen'
pwgen: command not found
real 0m0.074s
user 0m0.032s
sys 0m0.040s
# purge command-not-found and restart bash
$ time pwgen
-bash: pwgen: command not found
real 0m0.002s
user 0m0.000s
sys 0m0.000s
当然,具体时间可能与你的情况不同。我在一台非常强大的服务器上进行了测试。
答案2
问题的一部分是“有没有办法解决这个问题(在 Fedora 中)?”有办法:在 .bashrc 文件底部添加命令
unset command_not_found_handle
您可能希望在 .bashrc 的末尾(或接近末尾)执行此操作,因为您可能在 .bashrc 的顶部运行 /etc/bashrc 或其他 bash 脚本。
答案3
在 Fedora 上,可以通过更改配置文件来控制此行为/etc/PackageKit/CommandNotFound.conf
。
设置SoftwareSourceSearch=false
将消除延迟,因为它不会尝试使用包管理器来定位缺少命令的包。
您还可以更改等待包搜索的时间,方法是更改选项以MaxSearchTime=2000
指示您愿意等待包搜索返回匹配的毫秒数。我发现默认的 2 秒时间不足以返回任何匹配,并且当您输入错误时只会导致不必要的延迟。
要么提高MaxSearchTime
以提供有用的输出,要么禁用SoftwareSourceSearch
以完全消除延迟。