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


23

当您输入错误的命令时,说您想做:

$ cd ..
$ ls

但是相反,您输入的速度太快,最终在l和s之间输入了回车,因此得到:

$ cd ..
$ l
sbash: l: command not found...

当然,当我们快速键入时,这种情况一直都会发生。我很好奇的是错误命令文本出现在屏幕上之后2.5秒(在我的系统上)暂停的来源。在我看来,它会立即识别出错误的命令,并打印有关此错误的消息,但是为了娱乐起见,我需要等待2.5秒才能将我返回命令行。是什么原因造成的?有办法解决吗?这是一个小麻烦,但我想摆脱它。:)

编辑:运行Fedora 16系统


您忘记提及正在使用的操作系统。
丹尼尔·贝克

哇,您不将l别名为ls吗?:)
dotjoe 2012年

Answers:


42

此类行为是由频繁安装在某些挂接到bash的发行版上的工具引起的。该钩子使其可以使您在尝试运行命令而该命令不存在时,bash会搜索已配置存储库中的可用文件,并告诉您要安装该命令需要安装的软件包。

如果您不在Debian系统上,则需要查看bash启动文件配置文件等,以查看是否有任何内容定义了名为的函数command_not_found_handle。如果定义了该bash函数,则只要您运行命令并且在搜索路径中找不到合适的程序,就会调用该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

确切的时间对您而言当然会有所不同。我在功能强大的服务器上运行了测试。


10
以我在fedora中的情况为例,结果是一个名为:PackageKit-command-not-found
Fuu 2012年

6

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

unset command_not_found_handle

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


5

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

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

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

增大MaxSearchTime来提供有用的输出,或者禁用SoftwareSourceSearch以完全消除延迟。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.