bash 完成使 bash 启动缓慢

use*_*250 15 performance bashrc ubuntu tab-completion

在我的 ubuntu 系统上启动 bash 大约需要 2 秒。如果我删除 .bashrc 中的加载 /etc/bash_completion 它会立即启动。当然,我不想放弃完成,我不认为加载该文件是延迟 2 秒的正当理由。

任何想法如何找出问题所在或如何加快速度。

cYr*_*rus 12

我发现了一个有点骇人听闻的解决方案,它似乎足够有效。

解决方案

在底部~/.bashrc添加:

陷阱 '源 /etc/bash_completion ; 陷阱 USR1' USR1
{ 睡眠 0.1 ; 内置 kill -USR1 $$ ; } &否认

解释

trap 'source /etc/bash_completion ; trap USR1' USR1

设置一个处理程序以在 shell 接收到信号时运行SIGUSR1;处理程序将加载完成,因此它将自行停用。

{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown

异步等待一会儿,然后将信号发送到当前 shell。disown需要抑制bash过程控制反馈。sleep需要异步工作。

问题

出于某种原因,向该 shell 发出的第一个命令不会记录在历史记录中。

  • 巧妙!在解释中,trap 命令在末尾遗漏了一个“USR1”。 (2认同)

use*_*686 8

2013 年更新:大部分 bash 完成被重写为仅在需要时自动加载完成。核心脚本现在轻松多了。


在 shell 脚本标准中,完成脚本有时可能很大。在我可以访问的一台服务器上,它几乎有 1700 行(57 KB),而这只是核心脚本。其中/etc/bash_completion.d还有大约 200 个用于其他各种命令 ( openssl, mutt, mount...) 的附加脚本,总共 25537 行或 1.2 MB。每个脚本在获取时都会在定义完成处理程序之前检查命令是否实际可用;在这种情况下约 330 次,每次都涉及检查$PATH具有给定名称的可执行文件。(虽然我希望/usr/bin被缓存在内存中......)

诚然,即使只需要半秒钟负载,而不是两个完整的秒。但这可能至少是问题的一部分。运行du -hs /etc/bash_completion*wc -l /etc/bash_completion{,.d/*} | grep total如果你想检查。


您可以尝试在“跟踪”模式下手动获取脚本:

set -x
. /etc/bash_completion
Run Code Online (Sandbox Code Playgroud)

您将在执行时看到每一行。如果有一个特定的命令需要很长时间,你应该注意到它。

set +x禁用跟踪模式。)


xry*_*669 5

您应该使用 bash_completion 的最新版本 (2.0)。如果您使用的是 Debian,它是 wheezy,但它不依赖于任何其他 wheezy 软件包,因此您可以毫无问题地安装它。

最新版本动态加载完成,因此它将我的提示加载时间至少减少了 10 倍。