是什么导致 bash 在错误命令后暂停?

Fuu*_*Fuu 24 bash

当您输入错误命令时,请说您想要执行以下操作:

$ cd ..
$ ls
Run Code Online (Sandbox Code Playgroud)

但相反,您键入得太快并最终在 l 和 s 之间按 Enter,因此您会得到:

$ cd ..
$ l
sbash: l: command not found...
Run Code Online (Sandbox Code Playgroud)

当然,当我们快速打字时,这种情况总是会发生。我很好奇的是屏幕上出现错误命令文本后 2.5 秒(在我的系统上)暂停的来源。在我看来,它会立即识别错误的命令,打印有关它的错误消息,但只是为了好玩等待 2.5 秒,然后再返回命令行。这是什么原因造成的?有没有办法解决这个问题?这是一个小烦恼,但我想摆脱它。:)

编辑:运行 Fedora 16 系统

Zor*_*che 43

这种类型的行为是由一些经常安装在挂钩到 bash 的发行版上的工具引起的。这个钩子使得如果你尝试运行一个命令,而该命令不存在,那么 bash 将搜索配置的存储库中可用的文件,并告诉你需要安装什么包来获取该命令。

如果您不在 Debian 系统上,您将需要查看 bash 启动文件配置文件等,看看是否有任何内容定义了名为command_not_found_handle. 如果定义了该 bash 函数,那么每当您运行命令并且在您的搜索路径中找不到合适的程序时,它就会被调用。如果您运行typset | less并浏览输出,您将看到command_not_found_handle()已定义的函数。

在 Debian/Ubuntu 上,提供此行为的包是command-not-found。如果您清除它,那么您将禁用会减慢速度的查找。

这是一个例子

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

确切的时间当然对你来说会有所不同。我在一个非常强大的服务器上运行了我的测试。

  • 在我的 Fedora 案例中,结果是一个名为:PackageKit-command-not-found 的包 (10认同)

Sco*_*son 6

部分问题是“有没有办法解决这个问题(在 Fedora 中)?” 有:在 .bashrc 文件的底部添加命令

unset command_not_found_handle

您可能希望在 .bashrc 的末尾(或接近它)执行此操作,因为您可能正在 .bashrc 的顶部运行 /etc/bashrc 或其他 bash 脚本。


Ane*_*ner 5

在 Fedora 上,可以通过更改/etc/PackageKit/CommandNotFound.conf配置文件来控制此行为。

设置SoftwareSourceSearch=false将消除延迟,因为它不会尝试使用包管理器查找缺少命令的包。

您还可以更改等待包搜索的时间量,而不是通过更改MaxSearchTime=2000选项来指示您愿意等待包搜索返回匹配项的毫秒数。我发现默认的 2 秒不足以返回任何匹配项,并且只会在您输入错误时导致不必要的延迟。

要么提高MaxSearchTime以提供有用的输出,要么禁用SoftwareSourceSearch以完全消除延迟。