什么原因导致 bash 在执行错误命令后暂停?

什么原因导致 bash 在执行错误命令后暂停?

当你输入错误命令时,假设你想执行:

$ 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以完全消除延迟。

相关内容